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

如何在dplyr::mutate中批量求和指定变量,无需逐个输入变量名?

解决方法:动态生成变量名并逐行求和

嘿,我明白你的需求——不想手动敲每个变量名,想通过生成的方式把onecycle和twocycle每行求和得到all对吧?你的代码之所以没生效,是因为paste0(english(1:2), 'cycle')生成的是字符向量(比如"onecycle"、"twocycle"),而sum()直接对字符串操作根本不是你想要的逐行求和逻辑。下面给你几种靠谱的解决办法:

方法一:用dplyr的across(推荐,dplyr 1.0.0+适用)

across是dplyr里处理多列的利器,搭配all_of()可以直接把字符向量转换成列引用,再用rowSums()实现逐行求和:

library(dplyr)
library(english)

ex <- data.frame(onecycle = 1:10, twocycle = sample(1:10), recycle = sample(1:10), gvar = rep(1:5, each = 2))

# 动态生成变量名并求和
ex %>% 
  mutate(all = rowSums(across(all_of(paste0(english(1:2), 'cycle')))))

如果你的变量名有规律(比如都以cycle结尾且前缀是1、2对应的英文),还可以用matches()写正则匹配,更简洁:

ex %>% 
  mutate(all = rowSums(across(matches("^(one|two)cycle$"))))

方法二:用rlang的非标准求值

如果你习惯用旧版dplyr的语法,可以用syms()把字符向量转换成符号,再用!!!展开到select()里,最后求和:

library(rlang)

ex %>% 
  mutate(all = rowSums(select(., !!!syms(paste0(english(1:2), 'cycle')))))

补充说明

为什么不用sum()?因为sum()默认是对整列所有值求和,而你要的是每行对应列的和,所以必须用rowSums()来实现逐行计算的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:44:13