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

R语言如何按患者分组计算Timepoint B减A生成新Timepoint C

R语言多时间点差值计算实现

需求

  • 按患者编号PatientID分组
  • 仅处理同时有Timepoint为A、B两条记录的患者
  • 计算规则:Timepoint B的A~G列数值 减去 Timepoint A的同列数值,结果作为新行,新行Timepoint标记为C
  • 新生成的C行追加到原数据框中,单时间点患者不做处理

示例数据

df <- data.frame(PatientID = c("0002" ,"0002", "0005", "0005" ,"0009" ,"0009" ,"0018", "0018" ,"0020" ,"0027", "0039" ,"0039" ,"0042", "0043" ,"0043" ,"0045", "0046", "0046" ,"0048" ,"0048", "0055"),
                 Timepoint= c("A", "B", "A", "B", "A", "B", "A", "B", "A", "A", "A", "B", "A", "A", "B",  "A",  "A", "B", "A", "B", "A"),
                 A = c(NA , 977.146 , NA , 964.315 ,NA , 952.311 , NA , 950.797 , 958.975  ,960.712  ,NA , 947.465 , 902.852 , NA,  985.124  ,NA , 930.141 ,1007.790 , 948.848, 1027.110 , 999.414),
                 B = c(998.988 , NA , 998.680 , NA , NA ,1020.560 , 947.751 ,1029.560 , 955.540 , 911.606 , 964.039   ,    NA,  988.087 , 902.367 , 959.338 ,1029.050 , 925.162 , 987.374 ,1066.400  ,957.512 , 917.597),
                 C = c( NA , 987.140 , 961.810 , 929.466 , 978.166, 1005.820  ,925.752 , 969.469 , 943.398  ,936.034,  965.292 , 996.404 , 920.610 , 967.047  ,986.565 , 913.517 , 893.428 , 921.606 , NA , 929.590  ,950.493), 
                 D = c(975.634 , 987.140 , 961.810 , 929.466 , 978.166, 1005.820 , 925.752 , 969.469  ,943.398 , NA , 965.292 , 996.404 , NA , 967.047 , 986.565 , NA , 893.428 , 921.606 , 976.192 , 929.590 , 950.493),
                 E = c(1006.330, 1028.070 , NA , 954.274 ,1005.910  ,949.969 , 992.820 , 977.048  ,934.407 , 948.913 , NA , NA , NA,  961.375  ,955.296 , 961.128  ,998.119 ,1009.110 , 994.891 ,1000.170  ,982.763),
                 G= c(NA , 958.990 , NA , NA , 924.680 , 955.927 , NA , 949.384  ,973.348 , 984.392 , 943.894 , 961.468 , 995.368 , 994.997 , NA , 979.454 , 952.605 , NA  ,   NA, NA , 956.507), stringsAsFactors = F)

实现代码

使用dplyr包实现,逻辑清晰易维护:

# 加载依赖包
library(dplyr)

# 生成Timepoint C的差值行
df_c <- df %>%
  # 按患者分组
  group_by(PatientID) %>%
  # 筛选同时有A、B两个时间点的患者
  filter(all(c("A", "B") %in% Timepoint)) %>%
  # 对A-G列做B减A的差值计算
  summarise(across(A:G, ~ .x[Timepoint == "B"] - .x[Timepoint == "A"]),
            Timepoint = "C") %>%
  # 调整列顺序和原数据对齐
  select(PatientID, Timepoint, A:G) %>%
  ungroup()

# 把C行追加到原数据框
df_result <- bind_rows(df, df_c)

结果说明

  • 最终输出的df_result包含原数据所有行,和新增的8条Timepoint为C的行(示例数据中共有8名患者同时有A、B两个时间点)
  • 若某列A或B时间点为NA,差值结果也为NA,符合缺失值计算规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 21:42:03