R语言如何智能汇总含'_sales'的列生成新列,解决rowwise+across求和异常问题
原写法错误原因
你之前使用的md %>% rowwise()%>% mutate(sub_total=across(contains("_sales"),sum))不符合预期,核心是across会对每个匹配到的列单独执行求和,返回多列结果,不会自动合并为单行的汇总值。
以下是两种简洁高效的实现方案:
方案1:tidyverse生态写法
高优先级推荐(性能最优)
用rowSums搭配across,不需要行分组,大样本下运算速度远高于rowwise语法:
library(dplyr) # 示例数据 ori_data <- data.frame(a_sales=c(1:5), tsalses=c(1:5), b_sales=c(7:11), d_sales=c(1:5)) # 生成汇总列 res <- ori_data %>% mutate(sub_total = rowSums(across(contains("_sales")), na.rm = TRUE))
参数说明:na.rm = TRUE可以避免列中存在NA时汇总结果返回NA,无缺失值时可以删除该参数
rowwise语法修正版
如果需要保留rowwise写法,搭配c_across把选中列转为行向量再求和即可:
res <- ori_data %>% rowwise() %>% mutate(sub_total = sum(c_across(contains("_sales")), na.rm = TRUE)) %>% ungroup() # 处理完建议取消行分组,避免影响后续操作
方案2:基础R写法
不需要加载第三方包,直接用正则匹配选列+rowSums实现:
ori_data$sub_total <- rowSums(ori_data[grep("_sales", colnames(ori_data))], na.rm = TRUE)
以上两种方案都可以自动匹配所有名称包含_sales的列,不管符合条件的列数量多少,都只需要一行代码完成汇总,结果和手动逐列相加完全一致。
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

