如何在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
相关产品推荐
相关产品推荐

