这是一个简单的组成数据集:
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)
}
在这两种情况下它都不起作用,并且返回错误“要替换的项目数不是替换长度的倍数”。
编写循环代码的最佳解决方案是什么?我可以遍历数据帧?
答案 0 :(得分:0)
请参阅?Extract
:
递归(类似列表)对象
索引[类似于原子向量并选择一个列表 指定的元素。
[[和$选择列表中的单个元素。
简而言之,my.list[i]
会返回一个长度为1的列表,并且您正在尝试为其分配一个data.frame,这样就无法工作;而my.list[[i]]
返回列表中的data.frame #i,您可以用data.frame替换它。
所以你可以使用:
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)
}
但使用lapply
会更加简单,您不需要[[
:
my.list <- lapply(my.list, function(df) df$a <- df$x + df$y + df$z)
答案 1 :(得分:0)
使用lapply
,而不是使用显式循环从列表中提取data.frames。它需要一个data.frames(或任何对象)列表和一个函数,将该函数应用于列表的每个元素,并返回一个包含结果的列表。
# Sample data
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))
# Put them in a list
df_list <- list(df1, df2)
# Use lapply to iterate. FUN takes the function you want, and
# then its arguments (a = x + y + z) are just listed after it.
result_list <- lapply(df_list, FUN = transform, a = x + y + z)