R中用dplyr排除指定列实现多列按行汇总新增求和列
R中dplyr实现“排除指定列外全部列行汇总”的方法
如果不需要手动枚举所有待求和的列,仅通过指定需要排除的列完成行求和,完全可以借助dplyr内置的列选择语法实现,以下是两种可直接落地的写法:
基础实现方式(兼容大部分场景)
使用rowwise()配合c_across()函数,在选择列时直接标注需要排除的列即可:
library(dplyr) # 输入数据 df <- tibble(cat = c('A', 'B', 'C'), val1 = c(0.1, 0.3, 0.5), val2 = c(0.2, 0.2, 0.7), val3 = c(0.14, 0.31, 0.35), type = c(4, 2, 5)) # 计算排除cat、type两列后的行求和值 df <- df %>% rowwise() %>% mutate(sum = sum(c_across(!c(cat, type)), na.rm = TRUE)) %>% ungroup()
c_across()支持所有tidyselect规则,除了直接排除指定列,还可以灵活搭配选择逻辑,比如用starts_with("val")匹配所有val开头的列、用where(is.numeric)匹配所有数值列等,后续新增符合规则的列时不需要修改计算代码。
高性能实现方式(适合大数据集)
rowwise()本质是逐行循环,当数据量较大时性能较差,更推荐用向量化的rowSums配合across()实现,计算速度会有数量级提升:
df <- df %>% mutate(sum = rowSums(across(!c(cat, type), as.numeric), na.rm = TRUE))
- 该写法不需要切换分组/逐行模式,直接在原数据框上完成计算,输出结果和逐行计算完全一致。
注意事项
- 计算时建议添加
na.rm = TRUE参数,避免列中存在空值时整体求和结果为NA - 排除列时需确保被纳入计算的列均为可求和的数值类型,避免字符列参与计算触发报错
- 上述写法在dplyr 1.0.0及以上版本均可正常运行,低版本dplyr建议先升级包版本。
内容的提问来源于stack exchange,提问作者Vibramat
相关产品推荐
相关产品推荐

