如何基于列名前缀批量计算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
相关产品推荐
相关产品推荐

