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

如何用dplyr为每个个体提取首次MCI事件的FDAYS到DAYS列

用dplyr提取个体首次MCI=1时的FDAYS值

当然可以用dplyr实现这个需求,先指出你原代码的问题:你使用min(FDAYS)会取该ID所有随访记录里的最小FDAYS值,而非首次出现MCI=1时对应的FDAYS,这是导致结果不符合预期的原因。

首先先修正你数据代码里的笔误(变量名Vist应为Visit,否则会报错):

ID <-  c(1,1,1,1,1,2,2,2)
Visit <- c(1,2,3,4,5,1,2,3)
MCI <- c(0,1,0,1,0,0,1,1) 
FDAYS <- c(20,60,40,80,100,30,60,90)
df <- data.frame(ID, Visit, MCI, FDAYS)

下面提供两种简洁的实现方法:

方法一:先提取目标值再合并

先筛选出每个ID首次出现MCI=1的记录并提取FDAYS,再通过left_join合并回原数据集:

library(dplyr)

# 提取每个ID首次MCI=1对应的FDAYS
first_mci_days <- df %>%
  filter(MCI == 1) %>%
  group_by(ID) %>%
  slice_head(n = 1) %>% # 取每组第一条MCI=1的记录
  select(ID, DAYS = FDAYS)

# 合并到原数据
df_result <- df %>%
  left_join(first_mci_days, by = "ID")

方法二:分组后直接计算(更简洁)

在分组后直接通过first()函数提取每组中首次MCI=1对应的FDAYS值,赋值给新列DAYS:

df_result <- df %>%
  group_by(ID) %>%
  mutate(DAYS = first(FDAYS[MCI == 1])) %>%
  ungroup()

结果说明

运行上述代码后,每个ID的所有行都会被赋予该个体首次出现MCI=1时的FDAYS值:

  • ID=1首次MCI=1对应FDAYS=60,因此所有ID=1的行DAYS均为60
  • ID=2首次MCI=1对应FDAYS=60,因此所有ID=2的行DAYS均为60
    若某个ID无MCI=1的记录,DAYS会自动填充为NA,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:56:10