首页 文章

使用_2848196循环遍历数据帧[重复]

提问于
浏览
0

这个问题在这里已有答案:

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

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

    ?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)
    
  • 0

    而不是使用显式循环从列表中提取data.frames,只需使用 lapply . 它采用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)
    

相关问题