如何用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
相关产品推荐
相关产品推荐

