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

如何按ID、Sample_ID、Treatment分组计算Score的时间点差值?

分组计算Timepoint差值的解决方案

原代码问题分析

你用lead(Score) - Score的写法存在两个关键问题:

  1. 依赖行顺序:如果分组内的Timepoint不是严格按0→1排列,lead会取到错误的对应值,导致差值计算错误;
  2. 输出冗余:mutate会给每一行生成Diff,而你需要的是每个分组的单个差值结果。

推荐解决方案(不依赖行顺序,最可靠)

直接在分组后提取对应Timepoint的Score值做差,用summarize输出每个分组的结果:

library(dplyr)

df %>%
  group_by(ID, Sample_ID, Treatment) %>%
  summarize(
    Diff = Score[Timepoint == 1] - Score[Timepoint == 0],
    .groups = "drop"  # 可选:取消分组状态,方便后续操作
  )

运行后会得到你预期的结果:

IDSample_IDTreatmentDiff
AmuAContr-5
AmuATreat-4
AmuBContr-5
AmuBTreat-4

备选方案:宽表转换法

如果需要保留原始两个时间点的Score值,可以先转成宽表再计算:

library(tidyr)
library(dplyr)

df %>%
  pivot_wider(
    id_cols = c(ID, Sample_ID, Treatment),
    names_from = Timepoint,
    values_from = Score,
    names_prefix = "Time_"
  ) %>%
  mutate(Diff = Time_1 - Time_0)

这个方法会生成Time_0和Time_1列,方便同时查看原始值和差值。


原代码修复(不推荐,依赖行顺序)

如果一定要用lead,必须先确保分组内按Timepoint升序排序,再过滤出有效差值行:

df %>%
  group_by(ID, Sample_ID, Treatment) %>%
  arrange(Timepoint, .by_group = TRUE) %>%  # 强制分组内按Timepoint从0到1排序
  mutate(Diff = lead(Score) - Score) %>%
  filter(Timepoint == 0)  # 只保留每个分组的差值行

但此方法容错性差,若分组内缺少某个Timepoint值,会出现NA错误。

内容的提问来源于stack exchange,提问作者Erik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:35:10