如何在R中按行求和并自动选取首列以外的所有列?
解决方案
首先可以先优化你的数据创建代码,避免不必要的类型转换:
a <- c("people", "contracts", "design") b <- c(1,2,3) c <- c(2,3,4) d <- c(5,6,7) # 直接创建data.frame,自动保留各列的原始类型 df <- data.frame(a, b, c, d)
针对你需要自动选取首列之外所有列进行按行求和的需求,有以下几种高效的实现方式:
方法1:使用rowSums(推荐,效率最高)
rowSums是R原生的按行求和函数,结合dplyr::select排除首列,适合大多数场景:
library(dplyr) df %>% mutate(total = rowSums(select(., -1), na.rm = TRUE))
select(., -1)表示选取除第一列外的所有列na.rm = TRUE用于忽略缺失值,如果你的数据没有缺失可以省略
方法2:使用across结合rowwise(适合复杂行运算场景)
如果后续需要更复杂的按行操作(不只是求和),可以用across配合rowwise:
df %>% rowwise() %>% mutate(total = sum(across(-1), na.rm = TRUE)) %>% ungroup() # 务必取消行分组,避免后续操作的性能损耗
方法3:按列类型选取(更通用)
如果需要确保只对数值型列求和(即使后续新增列中有非数值列也能自动过滤),可以用where(is.numeric):
df %>% mutate(total = rowSums(across(where(is.numeric)), na.rm = TRUE))
以上三种方法都能自动适配后续新增的e、f、g等列,无需手动修改列名。
内容的提问来源于stack exchange,提问作者TheBoomerang
相关产品推荐
相关产品推荐

