使用'for'循环遍历数据框

时间:2016-08-29 15:50:10

标签: r loops

这是一个简单的组成数据集:

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 个答案:

答案 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)