【问题标题】:Add columns to data frames with for loop使用 for 循环将列添加到数据框
【发布时间】:2019-05-16 18:38:01
【问题描述】:

这个问题的变体已经得到解答,但作为一个相对缺乏 R/编程经验的人,我正在努力将它们应用到我的数据集。我有几个数据框,我正在尝试使用 for 循环来创建一个添加到每个数据框的新变量。

每个数据帧都有完全相同的列名,但数据帧代表不同的时间点(例如,w1 是 wave 1,w2 是 wave 2,等等)。

我完成了一个 for 循环,以 1) 对几个项目进行反向评分,然后 2) 计算一个新变量,该变量只是几个变量的总和。

w1
cesd1   cesd2
0       0
1       1
2       1 


w2
cesd1   cesd2
3       0
1       2
2       1 

waves = list(w1, w2)

for(i in 1:length(waves)) {
waves[[i]]$cesd2R <- abs(waves[[i]]$cesd2 - 3)

waves[[i]]$cesdTot <- with(waves[[i]], cesd1+ cesd2R, na.rm = T)
}

我想获得一个输出,其中包括每个数据帧中的所有先前列以及我在每个数据帧的循环中计算的新列(“cesd2R”和“cesdTot”)。

w1
cesd1   cesd2  cesd2R cesdTot
0       0       3     3 
1       1       2     3



w2
cesd1   cesd2 cesd2R cesdTot
3       0     3      6
1       2     1      2 

当我运行循环时,我没有收到任何错误,但似乎什么也没发生。我错过了什么?非常感谢!

【问题讨论】:

  • 当我运行你的代码时,waves 中的 data.frames 似乎是你想要的结果,所以我似乎无法复制你的问题。您是否可能忽略了将waves 列表中的结果重新分配给w1w2
  • 是的,这是我遗漏的最后一步——我没有将 wave 分配回 w1 和 w2,所以我通过以下方式解决了它:w1 = waves[[1]]。谢谢!

标签: r for-loop cbind


【解决方案1】:

看起来您在循环中创建第二个对象时输入错误。您键入的是 cesdR2 而不是 cesd2R。这样能解决吗?

> for(i in 1:length(waves)) {
+   waves[[i]]$cesd2R <- abs(waves[[i]]$cesd2 - 3)
+   waves[[i]]$cesdTot <- with(waves[[i]], cesd1+ cesd2R, na.rm = T)
+ }
> waves
[[1]]
  cesd1 cesd2 cesd2R cesdTot
1     0     0      3       3
2     1     1      2       3
3     2     1      2       4

[[2]]
  cesd1 cesd2 cesd2R cesdTot
1     3     0      3       6
2     1     2      1       2
3     2     1      2       4

【讨论】:

    【解决方案2】:

    (a) 注意名称,您的代码在一处使用cesdR2,但您的文本和示例数据使用cesd2R

    (b) 您将na.rm = TRUE 作为with() 的参数,这将无法按预期工作。 + 也没有空间容纳 na.rm 参数,所以这是一种方法:

    for(i in 1:length(waves)) {
      waves[[i]]$cesd2R <- abs(waves[[i]]$cesd2 - 3)
      waves[[i]]$cesdTot <- rowSums(waves[[i]][, c("cesd1", "cesd2R")], na.rm = TRUE)
    }
    

    因为rowSums 确实接受na.rm 参数。

    【讨论】:

      【解决方案3】:

      我从一位同事那里得到了一些帮助并解决了我的问题,这只是缺少将“波”分配回每个原始数据帧的步骤。

      所以原始代码有效:

      w1
      cesd1   cesd2
      0       0
      1       1
      2       1 
      
      
      w2
      cesd1   cesd2
      3       0
      1       2
      2       1 
      
      waves = list(w1, w2)
      
      for(i in 1:length(waves)) {
      waves[[i]]$cesd2R <- abs(waves[[i]]$cesd2 - 3)
      
      waves[[i]]$cesdTot <- with(waves[[i]], cesd1+ cesd2R, na.rm = T)
      }
      

      我补充说:

      w1 = waves[[1]]
      w2 = waves[[2]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        • 2018-07-20
        • 2021-03-15
        • 1970-01-01
        • 2022-07-19
        相关资源
        最近更新 更多