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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:52:31