我得到了几个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中使用运算符,因为它在技术上也是一个函数)。 但是,这种方法的主要缺点是,对于要对该列表的所有元素执行的每个小任务,都需要一个小辅助函数。
答案 0 :(得分:6)
你的代码非常好R.但你有两种选择:
[
运算符 - 特定于此案例你原来的:
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数组中,所有已知的索引技巧都将在该数组中运行。