3

我得到了几个 data.frames 的列表,我想从每个 data.frames 中删除前 2 列。我是按如下方式进行的,但觉得这可能更 R-ish。

data(mtcars)
data(iris)
myList <- list(A = mtcars, B = iris)
# helper function
removeCols <- function(df,vec) {
res <- df[,-vec]
}
lapply(myList,removeCols,1:2)

显然这可以完成工作,但对我来说,我似乎在这里错过了一些东西(例如在 lapply 中使用运算符,因为它在技术上也是一个函数)。但是,这种方法的主要缺点是您需要一个小辅助函数来处理您想要对该列表的所有元素执行的每个小任务。

4

2 回答 2

6

您的代码是非常好的 R。但是您有两种选择:

  1. 使用匿名函数 - 这是一个通用的解决方案
  2. 使用[运算符 - 特定于这种情况

您的原件:

xx <- lapply(myList,removeCols,1:2)

匿名函数:

yy <- lapply(myList, function(df, vec){df[,-vec]}, 1:2)

使用[运算符:

zz <- lapply(myList, "[", -(1:2))

这些产生相同的结果

identical(xx, yy)
[1] TRUE

identical(xx, zz)
[1] TRUE
于 2012-08-09T09:03:50.397 回答
4

目前我唯一能想象到的 R-ish 就是让它更短并摆脱辅助功能。

data(mtcars)
data(iris)
myList <- list(A = mtcars, B = iris)
lapply(myList,function(x) x[,-(1:2)])

如果您要求直接修改某些内容:

myList[[1]][,-(1:2)]

但是由于列表是一个非常开放的结构,对其内容没有要求,因此您不能对其内容进行索引,因为它们可能确实不同。但是,如果您的两个数据集具有相同的维度 (nxm),那么您可以将它们组合成一个 3d 数组,所有已知的索引技巧都可以在该数组上工作。

于 2012-08-09T09:03:42.490 回答