使用dplyr重构Base R脚本:按Gene分组以C组值做组内减法
用dplyr实现按样本匹配的组间差值计算
嘿,这个需求用dplyr处理非常顺畅!我来给你拆解一下实现步骤,保证清晰易懂:
核心思路
我们需要先提取gene == 'C'组的每个样本对应值作为参照,然后将原数据中每一行的value与同样本的C组值做减法(C组值 - 当前组值),最终得到差值结果。
完整代码实现
library(dplyr) # 你的原始数据集 x <- data.frame( gene = c('A','A','A','B','B','B','C','C','C'), sample = rep_len(c('wt','mut1','mut2'), 3), value = c(32.3, 31, 30.5, 25, 25.3, 22.1, 20.5, 21.2, 19.8) ) # 执行差值计算 result <- x %>% # 左连接C组的参照值:按sample匹配,避免丢失原数据行 left_join( x %>% filter(gene == 'C') %>% select(sample, c_value = value), by = "sample" ) %>% # 计算C组值减去当前组值的差值 mutate(diff = c_value - value) %>% # 可选:移除临时的参照值列 select(-c_value) # 查看结果 print(result)
代码解释
- 提取参照值:
x %>% filter(gene == 'C') %>% select(sample, c_value = value)这一步筛选出C组数据,并重命名value为c_value,避免和原表的value冲突,得到每个样本对应的C组参照值。 - 匹配参照值:使用
left_join按sample字段将原数据和参照值表合并,确保原数据的每一行都能找到对应样本的C组值(哪怕某个样本在C组不存在,也不会丢失原数据行)。 - 计算差值:
mutate(diff = c_value - value)完成核心的减法操作,得到你需要的差值列。
输出结果
运行代码后会得到包含差值列的完整数据集:
gene sample value diff 1 A wt 32.3 -11.8 2 A mut1 31.0 -9.8 3 A mut2 30.5 -10.7 4 B wt 25.0 -4.5 5 B mut1 25.3 -4.1 6 B mut2 22.1 -2.3 7 C wt 20.5 0.0 8 C mut1 21.2 0.0 9 C mut2 19.8 0.0
可选优化:仅保留非C组结果
如果你只需要A、B组的差值数据,可以在最后添加filter(gene != 'C'):
result <- x %>% left_join( x %>% filter(gene == 'C') %>% select(sample, c_value = value), by = "sample" ) %>% mutate(diff = c_value - value) %>% select(-c_value) %>% filter(gene != 'C')
内容的提问来源于stack exchange,提问作者interrobang
相关产品推荐
相关产品推荐

