如何在dplyr中结合列名向量实现行(rowwise)求和?
解决用列名向量实现行求和的问题
首先咱们明确核心问题:你直接把字符串向量to_sum传入sum()时,R会将它当成普通字符串集合处理,而不是解析成数据框的列,所以自然得不到正确结果。下面给你两种实用解决方案,附详细解释:
方法1:用c_across()配合rowwise()(tidyverse推荐方式)
c_across()是dplyr专门为rowwise()环境设计的函数,用来提取每行的指定列值,完美适配你的场景:
library(tibble) library(dplyr) df <- tibble( foo = c(1,0,1), bar = c(1,1,1), foobar = c(0,1,1) ) to_sum <- c("foo", "bar") df %>% rowwise() %>% mutate(sum = sum(c_across(all_of(to_sum)))) %>% ungroup() # 建议取消rowwise,避免后续操作被行分组限制
运行后就能得到你想要的结果:
# A tibble: 3 × 4 foo bar foobar sum <dbl> <dbl> <dbl> <dbl> 1 1 1 0 2 2 0 1 1 1 3 1 1 1 2
这里的all_of(to_sum)是关键,它能把字符串向量转换成dplyr可识别的列引用,让c_across()准确找到你要求和的列。
方法2:用rowSums()替代rowwise()(更高效的向量化操作)
如果你的数据量较大,rowwise()的性能会不如向量化操作,这时可以直接用rowSums()配合across():
df %>% mutate(sum = rowSums(across(all_of(to_sum))))
这个写法不需要开启rowwise(),直接对选中的列按行求和,结果和上面完全一致,且运行速度更快。
为什么原来的写法不行?
你之前尝试的sum(to_sum)或者sum("foo", "bar"),本质是在对字符串求和:R会尝试把字符串转换成数值,但"foo"和"bar"无法转成有效数值,最终会返回NA或者报错,这显然不是你要的对数据框列求和的逻辑。
内容的提问来源于stack exchange,提问作者MKR
相关产品推荐
相关产品推荐

