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

如何基于列名前缀批量计算R语言数据框的行求和

按列名前缀灵活分组计算行求和的通用实现(R语言)

原始数据

首先生成示例数据框:

set.seed(123)
df <- data.frame(ID = 1:5, matrix(round(rnorm(45), 1), 5, dimnames = list(NULL, paste0(rep(c('A', 'B', 'C'), 2:4), sequence(2:4)))))

数据结构如下:

#   ID   A1   A2   B1   B2   B3   C1   C2   C3   C4
# 1  1 -0.6  1.7  1.2  1.8 -1.1 -1.7  0.4  0.7 -0.7
# 2  2 -0.2  0.5  0.4  0.5 -0.2  0.8 -0.3  0.6 -0.2
# 3  3  1.6 -1.3  0.4 -2.0 -1.0  0.2  0.9 -0.1 -1.3
# 4  4  0.1 -0.7  0.1  0.7 -0.7 -1.1  0.9 -0.3  2.2
# 5  5  0.1 -0.4 -0.6 -0.5 -0.6  1.3  0.8 -0.4  1.2

需求说明

需要根据指定的列名前缀(存储在prefix向量中),对每个前缀对应的列计算行求和,生成{前缀}_sum格式的新列,且前缀可灵活调整(例如仅指定c('A', 'C')时,不处理B开头的列)。

通用解决方案

方法1:dplyr + across 动态生成列

利用dplyr的across函数遍历前缀向量,动态生成求和列,代码简洁且符合tidyverse风格:

library(dplyr)

# 指定需要处理的前缀
prefix <- c('A', 'B', 'C')

df %>%
  mutate(
    across(all_of(prefix), 
           ~ rowSums(pick(starts_with(.x))), 
           .names = "{.col}_sum")
  )

执行后结果:

#   ID   A1   A2   B1   B2   B3   C1   C2   C3   C4 A_sum B_sum C_sum
# 1  1 -0.6  1.7  1.2  1.8 -1.1 -1.7  0.4  0.7 -0.7   1.1   1.9  -1.3
# 2  2 -0.2  0.5  0.4  0.5 -0.2  0.8 -0.3  0.6 -0.2   0.3   0.7   0.9
# 3  3  1.6 -1.3  0.4 -2.0 -1.0  0.2  0.9 -0.1 -1.3   0.3  -2.6  -0.3
# 4  4  0.1 -0.7  0.1  0.7 -0.7 -1.1  0.9 -0.3  2.2  -0.6   0.1   1.7
# 5  5  0.1 -0.4 -0.6 -0.5 -0.6  1.3  0.8 -0.4  1.2  -0.3  -1.7   2.9

若调整前缀为c('A', 'C'),则仅生成对应求和列:

prefix <- c('A', 'C')

df %>%
  mutate(
    across(all_of(prefix), 
           ~ rowSums(pick(starts_with(.x))), 
           .names = "{.col}_sum")
  )

方法2:purrr + bind_cols 生成汇总列后绑定

借助purrr的map_dfc批量生成求和列,再与原数据框合并:

library(dplyr)
library(purrr)

prefix <- c('A', 'B', 'C')

# 生成所有求和列
sum_cols <- map_dfc(prefix, ~ df %>% 
                      select(starts_with(.x)) %>% 
                      rowSums() %>% 
                      set_names(paste0(.x, "_sum")))

# 合并到原数据框
df %>% bind_cols(sum_cols)

方法3:Base R 实现

无需额外依赖包,用循环遍历前缀完成计算:

prefix <- c('A', 'B', 'C')

for(p in prefix) {
  # 筛选对应前缀的列并计算行求和
  df[[paste0(p, "_sum")]] <- rowSums(df[, startsWith(colnames(df), p), drop = FALSE])
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:57:16