使用for循环将列添加到数据框

时间:2019-05-16 18:38:01

标签: r for-loop cbind

这个问题的变体已经得到了回答,但是作为一个相对缺乏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 

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

3 个答案:

答案 0 :(得分:0)

看起来像在循环中创建第二个对象时输入错误。您键入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

答案 1 :(得分:0)

(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参数。

答案 2 :(得分:0)

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

因此原始代码有效:

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]]