如何索引(子集)data.frames列表

时间:2012-08-09 08:56:21

标签: r list dataframe lapply

我得到了几个data.frames的列表,我想从每个data.frames中删除前两列。我这样做了,但觉得这可能更像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中使用运算符,因为它在技术上也是一个函数)。 但是,这种方法的主要缺点是,对于要对该列表的所有元素执行的每个小任务,都需要一个小辅助函数。

2 个答案:

答案 0 :(得分:6)

你的代码非常好R.但你有两种选择:

  1. 使用匿名函数 - 这是一般解决方案
  2. 使用[运算符 - 特定于此案例
  3. 你原来的:

    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
    

答案 1 :(得分: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数组中,所有已知的索引技巧都将在该数组中运行。