求助:在R中合并名称相似的列并计算列值总和
解决R中相似名称列的合并求和问题
输入数据示例
先构造可复现的输入数据:
df <- data.frame( sample = 1:5, Unidentified…1 = c(5,7,8,9,0), Unidentified…2 = c(3,2,4,6,7), Pathogen..1 = c(6,1,2,4,5), Pathogen…2 = c(8,0,9,0,1) )
方法一:使用tidyverse工具链
适合熟悉tidy语法的用户,步骤清晰易读:
library(tidyverse) # 转为长格式,提取每个列的原始名称(去掉后缀的点和数字) df_long <- df %>% pivot_longer(-sample, names_to = "col_name", values_to = "value") %>% mutate(group = str_remove(col_name, "\\.*\\d+$")) # 匹配末尾的点和数字并删除 # 按样本和分组求和,再转回宽格式 df_result <- df_long %>% group_by(sample, group) %>% summarise(sum_value = sum(value), .groups = "drop") %>% pivot_wider(names_from = group, values_from = sum_value) # 查看结果 df_result
方法二:使用Base R
无需额外安装包,适合轻量需求:
# 提取列名的分组前缀(去掉末尾的点和数字) col_groups <- sub("\\.*\\d+$", "", colnames(df)[-1]) # 排除sample列 # 按分组对列求和 summed_cols <- tapply(colnames(df)[-1], col_groups, function(cols) rowSums(df[cols])) # 合并sample列和求和结果 df_result_base <- cbind(df["sample"], as.data.frame(summed_cols)) # 查看结果 df_result_base
关键说明
- 正则表达式
\\.*\\d+$用于匹配列名末尾的任意数量的点(包括中文全角点)和数字,确保准确提取原始列名 - 如果列名后缀格式有变化(比如
_1),可调整正则表达式为_\\d+$ - 两种方法最终输出结果与期望格式完全一致
内容的提问来源于stack exchange,提问作者pradoer
相关产品推荐
相关产品推荐

