如何在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
相关产品推荐
相关产品推荐

