在tidyverse中如何将字符向量变量转为符号并计算随机列之和?
用tidyverse计算数据框随机两列的行和
问题根源
你代码里的vars是字符向量,{{vars}}只是把这个字符向量展开,sum()会尝试对字符值求和,自然抛出类型错误。下面是几种tidyverse的解决思路:
方法1:用pick() + rowSums()(推荐,更高效)
不需要用rowwise(),rowSums直接按行计算选中列的和,性能更好:
df <- data.frame(a=seq(1,3),b=seq(4,6),c=seq(7,9)) vars <- sample(letters[1:3],2) df %>% mutate(s = rowSums(pick(all_of(vars))))
pick(all_of(vars))会根据字符向量vars匹配并选中对应的列,rowSums直接计算每行的累加和。
方法2:rowwise()配合符号求值
如果一定要用rowwise(),需要把字符向量转换成列名符号再展开:
df %>% rowwise() %>% mutate(s = sum(!!!syms(vars))) %>% ungroup()
syms(vars)把字符向量转成代表列名的符号列表!!!将符号列表展开成独立的列引用,让sum()能正确读取每行的列值- 最后记得用
ungroup()取消行分组,避免后续操作受影响
方法3:across() + rowSums()
和方法1逻辑类似,用across()选中目标列后计算行和:
df %>% mutate(s = rowSums(across(all_of(vars))))
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

