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

基于特定条件合并R语言患者随访数据的技术问询

患者随访数据合并处理方案

原始数据集

df <- data.frame(
  Patient = c('Dave', 'Dave', 'Dave','Dave','Dave','Dave','Dave', "Angel", "Angel", "Angel", "Cara", "Cara"),
  V1 = c(1, 150, 240,430,530,650,800, 1, 150, 375, 1, 150),
  V2 = c(150, 240,430,530,650,800,900, 150, 375, 568, 150,375),
  R1 = c("Disease","Disease","Disease","Response","Response","Disease","Response", "Disease","Response", "Response", "Disease", "Response"),
  R2 = c("Disease", "Disease", "Response","Response","Disease","Response","Response", "Response", "Response", "Response", "Response", "Death")
)

需求说明

按患者分组,合并状态连续相同的行直至状态发生变化,最终数据集保留R1≠R2的行(最后一条记录除外)。逻辑伪代码如下:

if (r1 = r2 & not last record) { 
  record v1 and r1 
  walkthrough data until r1=r2 or last record 
  record v2 and r2 
  print 
}

预期输出

PatientV1V2R1R2
Dave1430DiseaseResponse
Dave430650ResponseDisease
Dave650800DiseaseResponse
Dave800900ResponseResponse
Angel1568DiseaseResponse
Cara1375DiseaseDeath

解决方案(基于dplyr)

library(dplyr)

df_processed <- df %>%
  group_by(Patient) %>%
  # 生成状态分组:当相邻行的状态衔接中断时,创建新分组
  mutate(status_group = cumsum(c(TRUE, R2[-n()] != R1[-1]))) %>%
  group_by(Patient, status_group) %>%
  # 聚合每组的起始/结束时间、起始/结束状态
  summarise(
    V1 = first(V1),
    V2 = last(V2),
    R1 = first(R1),
    R2 = last(R2),
    .groups = "drop"
  ) %>%
  group_by(Patient) %>%
  # 标记每组最后一条记录,筛选符合条件的行
  mutate(is_last = row_number() == n()) %>%
  filter(R1 != R2 | is_last) %>%
  select(-status_group, -is_last)

# 查看结果
print(df_processed)

代码逻辑说明

  1. 状态分组:按患者分组后,通过cumsum识别状态变化节点——每当前一行的结束状态(R2)和当前行的起始状态(R1)不一致时,就生成新的分组编号,将连续相同状态的行归为一组。
  2. 聚合数据:对每个状态分组,提取组内最早的随访起始时间(V1)、最晚的随访结束时间(V2)、起始状态(R1)和结束状态(R2)。
  3. 筛选结果:再次按患者分组,标记每组的最后一条记录,保留R1≠R2的行或每组的最后一条记录,满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:57:47