如何在R中按属/科分组合并行并批量汇总样本列值?
需求:按分类层级(属/科)批量汇总样本列读数
现有包含约80个Sample列的R语言dataframe,需无需逐个指定样本名,按**属(Genus)或科(Family)**列分组,合并对应行并汇总所有Sample列的原始读数。此前参考的方案仅支持单列值的合并汇总,无法满足批量处理需求。
示例数据
df <- data.frame(OTU_ID = c(123,456,789,101,102,232,221), Kingdom = rep(c("Viridiplantae"),7), Phylum = rep(c("Streptophyta"),7), Class = rep(c("Magnoliopsida"),7), Order = c("Asterales","Asterales","Fabales","Fabales","Dipsacales","Asterales","Fabales"), Family = c("Asteraceae","Asteraceae","Fabaceae","Fabaceae","Caprifoliaceae","Asteraceae","Fabaceae"), Genus = c("Gymnanthemum","Gymnanthemum","Trifolium","Trifolium","Hypericum","Felicia","Trifolium"), Species = c("amygdalinum","amygdalinum","pannonicum","pratense","perforatum","heterophylla","pannonicum"), Sample1 = c(436,0,0,1167,37704,0,0), Sample2 = c(1146,0,0,285,38489,0,0), Sample3 = c(19547,0,0,87,13732,0,0), Sample4 = c(564,0,0,0,34821,0,0), Sample5 = c(579,0,0,0,0,17632,0), Sample6 = c(0,366,50,0,0,30457,100))
数据展示:
OTU_ID Kingdom Phylum Class Order Family Genus Species Sample1 Sample2 Sample3 1 123 Viridiplantae Streptophyta Magnoliopsida Asterales Asteraceae Gymnanthemum amygdalinum 436 1146 19547 2 456 Viridiplantae Streptophyta Magnoliopsida Asterales Asteraceae Gymnanthemum amygdalinum 0 0 0 3 789 Viridiplantae Streptophyta Magnoliopsida Fabales Fabaceae Trifolium pannonicum 0 0 0 4 101 Viridiplantae Streptophyta Magnoliopsida Fabales Fabaceae Trifolium pratense 1167 285 87 5 102 Viridiplantae Streptophyta Magnoliopsida Dipsacales Caprifoliaceae Hypericum perforatum 37704 38489 13732 6 232 Viridiplantae Streptophyta Magnoliopsida Asterales Asteraceae Felicia heterophylla 0 0 0 7 221 Viridiplantae Streptophyta Magnoliopsida Fabales Fabaceae Trifolium pannonicum 0 0 0 Sample4 Sample5 Sample6 1 564 579 0 2 0 0 366 3 0 0 50 4 0 0 0 5 34821 0 0 6 0 17632 30457 7 0 0 100
期望结果(按属分组)
Kingdom Phylum Class Order Family Genus Sample1 Sample2 Sample3 Sample4 Sample5 Sample6 Viridiplantae Streptophyta Magnoliopsida Asterales Asteraceae Gymnanthemum 436 1146 19547 564 579 366 Viridiplantae Streptophyta Magnoliopsida Fabales Fabaceae Trifolium 1167 285 87 0 0 150 Viridiplantae Streptophyta Magnoliopsida Dipsacales Caprifoliaceae Hypericum 37704 38489 13732 34821 0 0 Viridiplantae Streptophyta Magnoliopsida Asterales Asteraceae Felicia 0 0 0 0 17632 30457
解决方案
使用dplyr包的across()函数可以批量匹配所有Sample列,无需逐个指定列名,高效完成分组汇总:
1. 按属(Genus)分组汇总
library(dplyr) df_genus <- df %>% # 按分类层级分组(确保同一属的分类信息一致) group_by(Kingdom, Phylum, Class, Order, Family, Genus) %>% # 对所有以Sample开头的列求和 summarise(across(starts_with("Sample"), sum), .groups = "drop")
2. 按科(Family)分组汇总
df_family <- df %>% # 按科及以上分类层级分组 group_by(Kingdom, Phylum, Class, Order, Family) %>% summarise(across(starts_with("Sample"), sum), .groups = "drop")
说明:
starts_with("Sample")会自动匹配所有列名以Sample开头的列,无论有多少个样本列都能批量处理;.groups = "drop"用于取消分组状态,返回普通dataframe格式;- 分组时包含Kingdom到对应层级的列,是为了保留完整的分类路径信息(同一属/科的这些分类信息是一致的)。
内容的提问来源于stack exchange,提问作者Katherine Chau
相关产品推荐
相关产品推荐

