You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在dplyr的mutate函数中使用sum函数出现异常结果的问题

解决dplyr mutate中sum函数不符合预期的问题

我来帮你搞定这个问题~你遇到的核心问题是对sum()函数的作用场景理解有点偏差,咱们一步步理清楚:

问题原因

你用的sum()是全局聚合函数,它会把ba_mat_x+ba_mat_y生成的整个向量里的所有非NA值全部加总,得到单一总和(1+2+2+3+4+5=13),然后dplyr会把这个单一值重复填充到每一行的新列里,这就是为啥所有行的ba_mat都是13,而不是你想要的每行单独求和结果。

几种正确的解决方案

下面给你三种常用的实现每行求和的方法,选你顺手的用就行:

方法1:用rowSums()(最简洁高效)

rowSums()是R专门用来计算每行数值型列总和的函数,天生支持na.rm参数,非常适合这个场景:

chk1 <- data.frame(ba_mat_x=c(1,2,3,4),ba_mat_y=c(NA,2,NA,5))

chk2 <- chk1 %>% 
  dplyr::mutate(ba_mat = rowSums(across(c(ba_mat_x, ba_mat_y)), na.rm = TRUE))

如果你的数据里只有这两列需要求和,还可以更简化:

chk2 <- chk1 %>% 
  dplyr::mutate(ba_mat = rowSums(., na.rm = TRUE))

方法2:用rowwise()+sum()

先把数据按行分组,这样sum()就会针对每行的两个值单独计算,而不是全局聚合:

chk2 <- chk1 %>% 
  rowwise() %>% 
  mutate(ba_mat = sum(ba_mat_x, ba_mat_y, na.rm = TRUE)) %>% 
  ungroup() # 记得取消行分组,避免后续操作受影响

方法3:手动处理NA后逐行相加

如果你想更直观地控制NA的处理逻辑,可以把NA替换成0再相加:

chk2 <- chk1 %>% 
  mutate(ba_mat = replace_na(ba_mat_x, 0) + replace_na(ba_mat_y, 0))

验证结果

不管用上面哪种方法,最终都会得到你预期的结果:

ba_mat_x ba_mat_y ba_mat
1 1 NA 1
2 2 2 4
3 3 NA 3
4 4 5 9

内容的提问来源于stack exchange,提问作者Aravindh Rajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:41:48