使用dplyr与rowwise按行求和异常:结果为全行总和而非单行
问题分析与修复方案
你的代码里有两个关键问题,导致算出的是所有行的总和,而非每行的求和结果:
错误对prca取反
需求是把三个变量加起来,但你写了-prca,这直接把求和变成了减prca,完全偏离需求。而且prca全是NA,取反后还是NA,na.rm=T会直接忽略这个值,相当于只算了beq和txditc的总和。sum函数的传参方式错了
在rowwise()环境里,直接写sum(beq, txditc, -prca, na.rm=T)时,beq、txditc这些都是整个列的向量,sum会把这三个向量里的所有元素全加起来,而不是针对每行的三个值求和。正确的做法是把当前行的三个值打包成一个向量,再丢给sum计算。
修正后的代码
library(dplyr) a <- tibble(beq=c(7.823,8.962,13.014,6.095,6.482), txditc=c(0.000,0.357,0.651,0.000,0.000), prca=c(NA,NA,NA,NA,NA)) a <- a %>% rowwise() %>% mutate(beq_new = sum(c(beq, txditc, prca), na.rm = TRUE)) %>% ungroup() # 处理完建议取消行分组,避免后续操作踩坑
验证结果
修正后每行的beq_new就是对应行三个变量的和(NA按0算),结果如下:
| beq | txditc | prca | beq_new |
|---|---|---|---|
| 7.823 | 0.000 | NA | 7.823 |
| 8.962 | 0.357 | NA | 9.319 |
| 13.014 | 0.651 | NA | 13.665 |
| 6.095 | 0.000 | NA | 6.095 |
| 6.482 | 0.000 | NA | 6.482 |
另外,要是不想用rowwise(),用rowSums更简洁:
a <- a %>% mutate(beq_new = rowSums(select(., beq, txditc, prca), na.rm = TRUE))
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

