这个问题的变体已经得到了回答,但作为一个相对缺乏R/编程经验的人,我正在努力将它们应用于我的数据集。我有几个数据帧,我正在尝试使用for循环来创建一个添加到每个数据帧的新变量。
每个数据帧具有完全相同的列名,但是数据帧表示不同的时间点(例如,w1是波1,w2是波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 当我运行循环时,我没有得到任何错误,但似乎什么都没有发生。我遗漏了什么?非常感谢!
发布于 2019-05-17 03:01:28
看起来你在循环中创建第二个对象的时候输入错误了。您输入的不是cesd2R,而是cesdR2。这样就解决了吗?
> 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发布于 2019-05-17 03:11:28
(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参数。
发布于 2019-05-17 03:40:15
我从一位同事那里得到了一些帮助,并解决了我的问题,我的问题只是缺少了将"waves“分配回每个原始数据帧的步骤。
所以原始代码是有效的:
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]]https://stackoverflow.com/questions/56174725
复制相似问题