在R语言中基于多条件创建time.to.event变量的实现问题
R语言:基于多条件分组创建
time.to.event变量 问题背景
现有数据框包含三个核心变量:
id:个体标识,相同id代表同一人date:就诊日期(已转为Date类型)outcome:患病标记,1表示患病,0表示未患病
数据示例代码
df = data.frame( id = c(1,1,1,1, 2,2,2,2, 3,3,3,3, 4,4,4,4), date = c('2013-01-01', '2014-01-01', '2015-01-01', '2016-01-01', '2013-01-01', '2014-01-01', '2015-01-01', '2016-01-01', '2013-01-01', '2014-01-01', '2015-01-01', '2016-01-01', '2013-01-01', '2014-01-01', '2015-01-01', '2016-01-01'), outcome = c(0,0,1,1, 0,1,0,0, 1,1,0,0, 0,0,0,0) ) %>% mutate(date = as.Date(date)) %>% as_tibble()
需求:time.to.event变量规则
- 若个体有患病记录(
outcome=1):取值为首次患病日期与首次就诊日期的天数差- 示例:
id=1首次患病日期2015-01-01,首次就诊2013-01-01,结果为730;id=2首次患病2014-01-01,结果365;id=3首次患病与首次就诊为同一天,结果0
- 示例:
- 若个体无患病记录:取值为最晚就诊日期与最早就诊日期的天数差
- 示例:
id=4结果为1095
- 示例:
用户尝试的代码(未成功)
df %>% group_by(id) %>% mutate(time.to.event = case_when(sum(outcome) == 0 ~max(date) - min(date), sum(outcome) != 0 ~ first(date[outcome == 1]) - min(date)))
问题原因与解决代码
问题点
原代码中first(date[outcome == 1])取的是原数据中第一个outcome=1的记录日期,而非时间最早的患病日期(若数据未按日期排序则会出错)。
修正代码
直接用min(date[outcome == 1])获取每组最早的患病日期,同时将日期差转为数值型:
df %>% group_by(id) %>% mutate(time.to.event = as.numeric( case_when( sum(outcome) > 0 ~ min(date[outcome == 1]) - min(date), TRUE ~ max(date) - min(date) ) ))
分步清晰版(含中间变量)
df %>% group_by(id) %>% mutate( first_visit = min(date), first_disease_date = min(date[outcome == 1]), time.to.event = case_when( any(outcome == 1) ~ as.numeric(first_disease_date - first_visit), TRUE ~ as.numeric(max(date) - first_visit) ) ) %>% select(-first_visit, -first_disease_date) # 可选:删除中间变量
最终结果
# A tibble: 16 × 4 # Groups: id [4] id date outcome time.to.event <dbl> <date> <dbl> <dbl> 1 1 2013-01-01 0 730 2 1 2014-01-01 0 730 3 1 2015-01-01 1 730 4 1 2016-01-01 1 730 5 2 2013-01-01 0 365 6 2 2014-01-01 1 365 7 2 2015-01-01 0 365 8 2 2016-01-01 0 365 9 3 2013-01-01 1 0 10 3 2014-01-01 1 0 11 3 2015-01-01 0 0 12 3 2016-01-01 0 0 13 4 2013-01-01 0 1095 14 4 2014-01-01 0 1095 15 4 2015-01-01 0 1095 16 4 2016-01-01 0 1095
内容的提问来源于stack exchange,提问作者zhiwei li
相关产品推荐
相关产品推荐

