首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用for循环向数据框添加列

使用for循环向数据框添加列
EN

Stack Overflow用户
提问于 2019-05-17 02:38:01
回答 3查看 66关注 0票数 1

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

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

我完成了一个for循环来1)反转几个项目的分数,然后2)计算一个新的变量,它只是几个变量的总和。

代码语言:javascript
复制
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")。

代码语言:javascript
复制
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 

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

EN

回答 3

Stack Overflow用户

发布于 2019-05-17 03:01:28

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

代码语言:javascript
复制
> 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
票数 0
EN

Stack Overflow用户

发布于 2019-05-17 03:11:28

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

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

代码语言:javascript
复制
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参数。

票数 0
EN

Stack Overflow用户

发布于 2019-05-17 03:40:15

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

所以原始代码是有效的:

代码语言:javascript
复制
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)
}

我加了一句:

代码语言:javascript
复制
w1 = waves[[1]]
w2 = waves[[2]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56174725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档