R语言如何按分组基于另一列条件计算单列数值差值
现有代码问题说明
- 列名拼写错误:你代码中写的
abunance少了字母d,正确列名是abundance - 索引取值缺少长度控制:如果分组内对应时间点的记录缺失,或者有重复记录,直接用
[ ]索引会返回长度不等于1的向量,mutate执行时会报错。
方案1:原有分组逻辑修正版
添加first()函数提取每个分组内的匹配值,缺失时自动返回NA:
IgH_CDR3_post_challenge_unique_vv <- IgH_CDR3_post_challenge_unique_v %>% group_by(gene) %>% mutate(increase_in_abundance = first(abundance[Timepoint == 'C1']) - first(abundance[Timepoint == 'C0'])) %>% ungroup()
方案2:宽表转换计算(更易排查问题)
先把时间点从行转成列,直接对列做减法,逻辑更直观:
library(tidyr) library(dplyr) IgH_CDR3_post_challenge_unique_vv <- IgH_CDR3_post_challenge_unique_v %>% # 时间点转成列,值取对应abundance pivot_wider(names_from = Timepoint, values_from = abundance) %>% # 直接计算差值,缺失时间点的记录差值自动为NA mutate(increase_in_abundance = C1 - C0) %>% # 若不需要保留长表格式可删除下面这行 pivot_longer(cols = c(C0, C1), names_to = "Timepoint", values_to = "abundance", values_drop_na = TRUE)
特殊场景处理
如果存在同一个基因同一个时间点有多条记录的情况,可以先做聚合再计算:
IgH_CDR3_post_challenge_unique_v %>% group_by(gene, Timepoint) %>% # 这里用sum求和,也可以根据需求换为mean取均值 summarise(abundance = sum(abundance), .groups = "drop_last") %>% mutate(increase_in_abundance = first(abundance[Timepoint == 'C1']) - first(abundance[Timepoint == 'C0'])) %>% ungroup()
计算效果说明
以你提供的样例数据为例,计算后:
- 基因1的
increase_in_abundance值为1(6-5) - 仅存在C1记录的基因2、仅存在C0记录的基因3,差值为NA
内容的提问来源于stack exchange,提问作者Chinemerem
相关产品推荐
相关产品推荐

