这个问题的变体已经得到了回答,但是作为一个相对缺乏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
运行循环时,我没有收到任何错误,但似乎什么也没发生。我想念什么?非常感谢你!
答案 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]]