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

如何用dplyr的mutate+across实现iris数据集行-wise求和?

基于dplyr实现行-wise求和的正确方法

你之前的两种写法都没达到预期,原因如下:

  • across(contains("Sepal"), sum) 是对每一列单独计算总和,返回的是一个包含两列总和的tibble,所以新列是嵌套的tibble结构,每行都是整个列的总和。
  • sum(c_across(contains("Sepal"))) 没有按行分组,sum会计算所有选中列的全局总和,然后把这个值重复填充到每一行。

以下是符合你需求的dplyr工作流解决方案:

方法1:用rowSums + across(最简洁)

iris1 <- iris %>% 
  mutate(totalSepalLength = rowSums(across(contains("Sepal")), na.rm = TRUE))

across(contains("Sepal")) 选中所有包含"Sepal"的列,rowSums直接对每行的这些列求和,返回数值向量,完美生成行-wise求和的新列。

方法2:用rowwise + c_across + sum(适合复杂行运算)

如果需要在每行执行更复杂的自定义运算,可先开启行分组:

iris1 <- iris %>% 
  rowwise() %>% 
  mutate(totalSepalLength = sum(c_across(contains("Sepal")), na.rm = TRUE)) %>% 
  ungroup() # 记得取消行分组,避免后续操作默认按行处理

rowwise() 让后续的mutate按行执行,c_across(contains("Sepal"))提取当前行的目标列值,sum就是对当前行的这些值求和,最后ungroup()恢复数据框的常规状态。

验证结果,查看前几行:

head(iris1[, c("Sepal.Length", "Sepal.Width", "totalSepalLength")])

输出会是:

Sepal.Length Sepal.Width totalSepalLength
1          5.1         3.5              8.6
2          4.9         3.0              7.9
3          4.7         3.2              7.9
4          4.6         3.1              7.7
5          5.0         3.6              8.6
6          5.4         3.9              9.3

完全符合行-wise求和的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:45:35