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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:18:09