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

如何在R中按分子公式分组汇总多列样本浓度值?

按分子公式分组批量求和的R语言解决方案

问题背景

现有包含脂质分子公式与多样本浓度的数据表,因存在异构体,相同分子公式的行重复出现。需按分子公式分组,对所有样本列的浓度分别求和,得到每个分子公式在各样本中的总浓度。

原始数据表

Molecular Formula AHBG13 AHBG15 AHBG16  AHBG19 AHBG20
C23H48NO7P  1767    4570    7052    8831    7921
C24H50NO7P  0   0   0   73331   0
C24H50NO7P  45335   48281   0   0   77333
C24H50NO7P  0   0   48537   0   0
C25H44NO7P  4190    3166    0   4903    6609
C26H48NO7P  5110    3102    0   8939    7772
C26H50NO7P  0   3021    1981    7770    5357
C26H52NO7P  6377    0   0   0   13176
C26H52NO7P  0   8245    7883    20806   0
C26H54NO7P  12049   27408   35437   45506   44353
C26H54NO7P  0   0   0   2123    2367
C26H54NO7P  0   1307    0   0   0
C28H50NO7P  0   6503    0   21058   10462
C28H50NO7P  7547    0   0   0   0
C28H50NO7P  6414    0   4990    0   0
C28H54NO7P  0   0   863 0   6411
C28H54NO7P  2107    4732    0   6778    0
C30H54NO7P  0   0   2185    8351    5841
C30H54NO7P  3809    0   0   0   0
C30H54NO7P  0   3886    0   0   0

预期结果

Molecular Formula AHBG13 AHBG15 AHBG16 AHBG19 AHBG20
C23H48NO7P  1767    4570    7052    8831    7921
C24H50NO7P  45335   48281   48537   73331   77333
C25H44NO7P  4190    3166    0   4903    6609
C26H48NO7P  5110    3102    0   8939    7772
C26H50NO7P  0   3021    1981    7770    5357
C26H52NO7P  6377    8245    7883    20806   13176
C26H54NO7P  12049   28715   35437   47629   46720

遇到的问题

尝试使用summarise(across(c("AHBG13","AHBG15","AHBG16","AHBG19","AHBG20"), sum))时,得到的是所有行的总浓度,而非按分子公式分组后的求和结果:

AHBG13  AHBG15  AHBG16  AHBG19  AHBG20
Molecular Formula   94705   114221  108928  208396  187602

解决方案

核心逻辑是先通过group_by()指定分组列,再用summarise(across())批量对数值列求和,以下是两种可行的流水线代码:

方法1:指定样本列范围

适用于样本列连续且已知列名的场景:

library(dplyr)

# 假设数据表存储在lipid_data数据框中
lipid_summary <- lipid_data %>%
  # 按分子公式分组
  group_by(`Molecular Formula`) %>%
  # 对AHBG13到AHBG20的所有列求和,分组后取消分组状态
  summarise(across(AHBG13:AHBG20, sum), .groups = "drop")

# 查看结果
print(lipid_summary)

方法2:自动识别数值列(更通用)

若样本列数量多且均为数值类型,无需手动列名,用where(is.numeric)自动匹配所有数值列:

library(dplyr)

lipid_summary <- lipid_data %>%
  group_by(`Molecular Formula`) %>%
  summarise(across(where(is.numeric), sum), .groups = "drop")

print(lipid_summary)

关键说明

之前的错误是缺少group_by()步骤,导致summarise()直接对整个数据框求和。添加group_by()后,summarise()会在每个分子公式的分组内独立计算各列的和,最终得到预期的分组汇总结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:35:03