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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:06:23