R语言中合并冗余植物物种行并聚合ReadSum列的方法咨询
问题描述
我有一个包含多种植物物种名称(列MTmatch,注:数据集实际列名为SPECIES)的数据集,部分物种名称存在重复。每个物种对应ReadSum列及其他多项信息。我需要:
- 合并所有重复物种的行,汇总对应的
ReadSum值,同时保留非冗余行; - 或者至少添加一列,显示重复物种的
ReadSum总和。
我尝试过用dplyr包的group_by()和summarise()函数,但似乎是对整列汇总而非按分组汇总。数据集结构如下:
structure(list(ESVID = c("ESV_000090", "ESV_000682", "ESV_000028", "ESV_000030", "ESV_000010", "ESV_000182", "ESV_000040", "ESV_000135", "ESV_000383"), S026401.R1 = c(0.222447727, 0, 0, 0, 0, 0, 0.029074432, 0, 0), S026404.R1 = c(0.022583349, 0, 0, 0, 0, 0, 0.016390389, 0.001257217, 0), S026406.R1 = c(0.360895503, 0, 0, 0.00814677, 0, 0, 0.01513888, 0, 0.00115466), S026409.R1 = c(0.221175955, 0, 0, 0, 0, 0, 0.005146173, 0, 0), S026412.R1 = c(0.026058888, 0, 0, 0, 0, 0, 0, 0, 0), MAX = c(0.400577608, 0.009933177, 0.124412855, 0.00814677, 0.009824944, 0.086475106, 0.154850408, 0.015593835, 0.008340888), ReadSum = c(3.54892343, 0.012059346, 0.203303936, 0.021075546, 0.009824944, 0.128007863, 0.859687787, 0.068159534, 0.050266853), SPECIES = c("Abies ", "Abies ", "Acer", "Alnus", "Berberis", "Betula ", "Boykinia", "Boykinia", "Boykinia")), row.names = c(NA, -9L), class = "data.frame")
解决方案
方案1:添加ReadSum汇总列(保留所有原始行)
用group_by()按物种分组,通过mutate()添加新列,每一行都会显示对应物种的ReadSum总和,不会丢失原始数据:
library(dplyr) # 加载数据集(假设数据框名为samp5) samp5 <- structure(list(ESVID = c("ESV_000090", "ESV_000682", "ESV_000028", "ESV_000030", "ESV_000010", "ESV_000182", "ESV_000040", "ESV_000135", "ESV_000383"), S026401.R1 = c(0.222447727, 0, 0, 0, 0, 0, 0.029074432, 0, 0), S026404.R1 = c(0.022583349, 0, 0, 0, 0, 0, 0.016390389, 0.001257217, 0), S026406.R1 = c(0.360895503, 0, 0, 0.00814677, 0, 0, 0.01513888, 0, 0.00115466), S026409.R1 = c(0.221175955, 0, 0, 0, 0, 0, 0.005146173, 0, 0), S026412.R1 = c(0.026058888, 0, 0, 0, 0, 0, 0, 0, 0), MAX = c(0.400577608, 0.009933177, 0.124412855, 0.00814677, 0.009824944, 0.086475106, 0.154850408, 0.015593835, 0.008340888), ReadSum = c(3.54892343, 0.012059346, 0.203303936, 0.021075546, 0.009824944, 0.128007863, 0.859687787, 0.068159534, 0.050266853), SPECIES = c("Abies ", "Abies ", "Acer", "Alnus", "Berberis", "Betula ", "Boykinia", "Boykinia", "Boykinia")), row.names = c(NA, -9L), class = "data.frame") # 添加物种级别的ReadSum汇总列 samp5_with_sum <- samp5 %>% group_by(SPECIES) %>% mutate(ReadSum_Total = sum(ReadSum, na.rm = TRUE)) %>% ungroup() # 查看结果 head(samp5_with_sum)
方案2:合并重复物种行(仅保留每个物种一行,汇总ReadSum)
如果需要合并重复行,用summarise()处理ReadSum,其他列可根据需求选择保留方式(比如取第一个值、均值或最大值等):
# 合并重复物种,汇总ReadSum,其他列按需处理 samp5_merged <- samp5 %>% group_by(SPECIES) %>% summarise( ReadSum_Total = sum(ReadSum, na.rm = TRUE), ESVID = first(ESVID), # 取该物种的第一个ESVID S026401.R1 = mean(S026401.R1, na.rm = TRUE), # 示例:取数值列的均值 MAX = max(MAX, na.rm = TRUE) # 示例:取MAX列的最大值 ) %>% ungroup() # 查看合并结果 print(samp5_merged)
关键注意点
- 你之前用
group_by()+summarise()出错,大概率是分组列名匹配问题(比如你说的MTmatch和实际数据的SPECIES不符),或是summarise()时未明确指定要计算/保留的列; - 注意物种名称的空格问题(比如
"Abies "带空格和"Abies"会被视为不同分组),可提前用trimws()清理:samp5 <- samp5 %>% mutate(SPECIES = trimws(SPECIES))
内容的提问来源于stack exchange,提问作者salix7
相关产品推荐
相关产品推荐

