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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:34:48