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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:35:24