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

