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

R语言按患者ID分组计算随访时间并提取首次就诊记录

R语言患者随访数据处理实现方案

初始数据集构造

先运行以下代码生成原始patient数据集:

patient <- data.frame(
  patient_ID = c(1,1,2,2,2,3,3,4,4,4),
  age = c(63,64,60,61,63,61,62,77,77,79),
  visit_number = c(1,2,1,2,3,1,2,1,2,3), 
  followup_days = c(0,504,0,390,798,0,379,0,310,621),
  diagnosis = c(0,0,0,1,1,0,0,0,0,1)
)

生成带time字段的patient1数据集

实现逻辑

按patient_ID对患者分组,对每个患者单独计算统一的time值:

  • 若患者存在确诊记录(diagnosis=1),取首次确诊对应随访间隔天数作为该患者所有记录的time值
  • 若患者全程无确诊记录,取末次就诊对应的随访间隔天数(即该患者最大的followup_days值)作为该患者所有记录的time值

代码实现(dplyr版本,代码简洁易读)

# 若未安装dplyr,先运行 install.packages("dplyr")
library(dplyr)

patient1 <- patient %>%
  group_by(patient_ID) %>%
  mutate(
    time = case_when(
      any(diagnosis == 1) ~ followup_days[which(diagnosis == 1)[1]],
      TRUE ~ max(followup_days)
    )
  ) %>%
  ungroup()

运行后得到的patient1和给出的示例结果完全一致。

生成仅含首次就诊记录的new_patient数据集

实现逻辑

在patient1的基础上,筛选visit_number=1(首次就诊)的记录即可。
注:给出的目标示例中diagnosis字段存在拼写笔误写为disgonosis,可按需重命名字段匹配示例。

代码实现

new_patient <- patient1 %>%
  filter(visit_number == 1)

# 若需要完全匹配示例的错误字段名,取消运行下一行注释
# new_patient <- new_patient %>% rename(disgonosis = diagnosis)

无第三方包依赖的基础R实现版本

如果不想安装dplyr包,可以直接用基础R语法完成全流程:

# 步骤1:计算每个患者对应的time值
time_map <- tapply(1:nrow(patient), patient$patient_ID, function(rows){
  sub_data <- patient[rows, ]
  if(any(sub_data$diagnosis == 1)){
    first_diag_row <- rows[sub_data$diagnosis == 1][1]
    return(patient$followup_days[first_diag_row])
  }else{
    return(max(sub_data$followup_days))
  }
})
patient$time <- as.numeric(time_map[as.character(patient$patient_ID)])
patient1 <- patient

# 步骤2:筛选首次就诊记录
new_patient <- patient1[patient1$visit_number == 1, ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:42:19