R语言按Disorder分组计算Mean.Enrichment占比并保留Cell.Class列
问题背景
现有如下结构的富集分析结果数据框:
structure(list(Cell.Class = c("Excitatory Neurons", "Inhibitory", "OPCs", "Medium Spiny Neurons", "Excitatory Neurons", "Inhibitory", "OPCs", "Medium Spiny Neurons", "Excitatory Neurons", "Inhibitory", "OPCs", "Medium Spiny Neurons"), Mean.Enrichment = c(2.8, 3, 0.4, 0.42, 18, 2.1, 0.8, 2.8, 0.3, 1, 0, 0), Disorder = c("Bipolar Disorder", "Bipolar Disorder", "Bipolar Disorder", "Bipolar Disorder", "Schizophrenia", "Schizophrenia", "Schizophrenia", "Schizophrenia", "Major Depression", "Major Depression", "Major Depression", "Major Depression")), class = "data.frame", row.names = c(NA, -12L))
数据预览:
> enrichment.means Cell.Class Mean.Enrichment Disorder 1 Excitatory Neurons 2.80 Bipolar Disorder 2 Inhibitory 3.00 Bipolar Disorder 3 OPCs 0.40 Bipolar Disorder 4 Medium Spiny Neurons 0.42 Bipolar Disorder 5 Excitatory Neurons 18.00 Schizophrenia 6 Inhibitory 2.10 Schizophrenia 7 OPCs 0.80 Schizophrenia 8 Medium Spiny Neurons 2.80 Schizophrenia 9 Excitatory Neurons 0.30 Major Depression 10 Inhibitory 1.00 Major Depression 11 OPCs 0.00 Major Depression 12 Medium Spiny Neurons 0.00 Major Depression
需求为按Disorder分组,计算每个Cell.Class对应的Mean.Enrichment占同组总Mean.Enrichment的比例。
原有代码运行后丢失了Cell.Class列,无法匹配比例对应的细胞类型,原有代码如下:
group_by(Disorder) %>% mutate(Sum= sum(Mean.Enrichment)) %>% group_by(Disorder, .add=TRUE) %>% summarise(Proportion = Mean.Enrichment/Sum)
原有错误输出:
Disorder Proportion <chr> <dbl> 1 Bipolar Disorder 0.423 2 Bipolar Disorder 0.453 3 Bipolar Disorder 0.0604 4 Bipolar Disorder 0.0634 5 Major Depression 0.231 6 Major Depression 0.769 7 Major Depression 0 8 Major Depression 0 9 Schizophrenia 0.759 10 Schizophrenia 0.0886 11 Schizophrenia 0.0338 12 Schizophrenia 0.118
问题原因
- 二次
group_by(Disorder, .add=TRUE)属于冗余操作,第一次分组已经按Disorder完成分组,重复添加分组没有实际意义 summarise()函数默认会折叠分组数据,仅保留分组列和汇总计算结果列,未纳入分组、未参与汇总计算的Cell.Class列会被自动丢弃
修正代码
直接使用mutate()在分组内计算比例即可,mutate()不会折叠数据行,会保留所有原始列:
library(dplyr) enrichment.means %>% group_by(Disorder) %>% mutate(Proportion = Mean.Enrichment / sum(Mean.Enrichment)) %>% ungroup()
如果需要保留分组总和列,可以直接在同一个mutate()里计算,不需要二次分组:
enrichment.means %>% group_by(Disorder) %>% mutate( Group_Sum = sum(Mean.Enrichment), Proportion = Mean.Enrichment / Group_Sum ) %>% ungroup()
运行后返回的结果会完整保留Cell.Class、Mean.Enrichment、Disorder三列原始信息,同时新增比例列,可直接匹配每个比例对应的细胞类型。
内容的提问来源于stack exchange,提问作者Workhorse
相关产品推荐
相关产品推荐

