【问题标题】:How to index (subset) over a list of data.frames如何对 data.frames 列表进行索引(子集)
【发布时间】:2012-08-06 11:16:00
【问题描述】:

我得到了几个 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 中使用运算符,因为它在技术上也是一个函数)。 但是,这种方法的主要缺点是您需要一个小辅助函数来处理您想要对该列表的所有元素执行的每个小任务。

【问题讨论】:

    标签: r list dataframe lapply


    【解决方案1】:

    您的代码是非常好的 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
    

    【讨论】:

    • +1,谢谢安德烈,您的第二个选项正是我想要的。当我之前尝试"[[" 时,我实际上已经很接近了。
    • @hans0l0 很高兴能帮上忙。请记住,[[ 仅返回单个元素。所以它有它的位置,但在这种情况下不是!
    【解决方案2】:

    目前我唯一能想到的 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 数组,所有已知的索引技巧都可以在该数组上工作。

    【讨论】:

      猜你喜欢
      • 2016-12-03
      • 2013-11-26
      • 2016-01-14
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2019-09-29
      相关资源
      最近更新 更多