这个问题在这里已有答案:
这是一个简单的组成数据集:
df1 <- data.frame(x = c(1,2,3),
y = c(4,6,8),
z= c(1, 6, 7))
df2 <- data.frame(x = c(3,5,6),
y = c(3,4,9),
z= c(6, 7, 7))
我想要做的是创建一个新变量“a”,它只是所有三个变量(x,y,z)的总和
而不是为每个数据帧单独执行此操作,我认为创建循环会更有效 . 所以这是我写的代码:
my.list<- list(df1, df2)
for (i in 1:2) {
my.list[i]$a<- my.list[i]$x +my.list[i]$y + my.list[i]$z
}
或者
for (i in 1:2) {
my.list[i]<- transform(my.list[i], a= x+ y+ z)
}
在这两种情况下它都不起作用,并返回错误“要替换的项目数不是替换长度的倍数” .
编写循环代码的最佳解决方案是什么?我可以遍历数据帧?
2 回答
见
?Extract
:简而言之,
my.list[i]
返回长度为1的列表,并且您正在尝试为其分配一个data.frame,因此不起作用;而my.list[[i]]
返回列表中的data.frame #i,您可以用data.frame替换它 .所以你可以使用:
要么
但是使用
lapply
甚至更简单,你不需要[[
:而不是使用显式循环从列表中提取data.frames,只需使用
lapply
. 它采用data.frames(或任何对象)和函数列表,将函数应用于列表的每个元素,并返回包含结果的列表 .