R从事件数据创建时变生存数据集

R从事件数据创建时变生存数据集,r,dataframe,dplyr,lubridate,survival-analysis,R,Dataframe,Dplyr,Lubridate,Survival Analysis,我想创建一个具有多个记录ID的生存数据集。现有事件数据由一行观测数据组成,日期格式为dd/mm/yy。这个想法是计算至少有一个事件/月的连续月数(有多年,因此必须以某种方式加以说明)。换言之,我想创造一些情节来捕捉这样的每月连胜,包括不活动的时期。举个例子,代码应该进行如下转换: df1 id event.date group1 01/01/16 group1 05/02/16 group1 07/03/16 group1 10/06/16 group1

我想创建一个具有多个记录ID的生存数据集。现有事件数据由一行观测数据组成,日期格式为
dd/mm/yy
。这个想法是计算至少有一个事件/月的连续月数(有多年,因此必须以某种方式加以说明)。换言之,我想创造一些情节来捕捉这样的每月连胜,包括不活动的时期。举个例子,代码应该进行如下转换:

df1
id        event.date
group1    01/01/16
group1    05/02/16
group1    07/03/16
group1    10/06/16
group1    12/09/16
为此:

df2
id        t0    t1    ep.no   ep.t   ep.type
group1    1     3     1       3      1  
group1    4     5     2       2      0
group1    6     6     3       1      1
group1    7     8     4       2      0
group1    9     9     5       1      1
group1    10    ...   ...     ...    ...
其中
t0
t1
是开始月和结束月,
ep.no
是特定
id
的事件计数器,
ep.t
是该特定事件的长度,
ep.type
表示事件类型(活动/非活动)。在上面的例子中,最初是三个月的活动,然后是两个月的休息,然后是一个月的复发等


我最关心的是将
t0
t1
df1
转换为
df2
,因为
df2
中的其他变量可以随后基于它们构建(例如,no是计数器,time是算术,type总是以1开头并交替)。考虑到问题的复杂性(至少对我来说),我需要提供实际数据,但我不确定这是否允许?我会看看如果一个mod插话我能做什么。

我想这正是你想要的。诀窍是确定需要一起处理的观察序列,使用
dplyr::lag
cumsum
是一种方法

# Convert to date objects, summarize by month, insert missing months
library(tidyverse)
library(lubridate)

# added rows of data to demonstrate that it works with 
# > id and > 1 event per month and rolls across year end
df1 <- read_table("id        event.date
group1    01/01/16
group1    02/01/16
group1    05/02/16
group1    07/03/16
group1    10/06/16
group1    12/09/16
group1    01/02/17
group2    01/01/16
group2    05/02/16
group2    07/03/16",col_types="cc")

# need to get rid of extra whitespace, but automatically converts to date
# summarize by month to count events per month
df1.1 <- mutate(df1, event.date=dmy(event.date),
              yr=year(event.date),
              mon=month(event.date))

# get down to one row per event and complete data
df2 <- group_by(df1.1,id,yr,mon) %>%
  summarize(events=n()) %>%
  complete(id, yr, mon=1:12, fill=list(events=0)) %>%
  group_by(id) %>%
  mutate(event = as.numeric(events >0),
    is_start=lag(event,default=-1)!=event,
    episode=cumsum(is_start), 
    episode.date=ymd(paste(yr,mon,1,sep="-"))) %>%
  group_by(id, episode) %>%
  summarize(t0 = first(episode.date),
            t1 = last(episode.date) %m+% months(1),
            ep.length = as.numeric((last(episode.date) %m+% months(1)) - first(episode.date)),
            ep.type = first(event)) 

这个问题对你有用吗:谢谢你的链接,我想应该归结到
lubridate
。我必须花一些时间确认它是否能解决我的问题(现在)。更新:当我使用接受答案中提供的代码时,我得到一个
df
,每组有一个观察值,其中包括一个计数变量,它捕获了连续事件的数量(在30天内)都是属于那个群体的。我需要的是每组多集。谢谢大家给我一个机会。但是,当我运行您的代码时,我在
summary(events=n())%%>%%
行中得到一个错误,表示缺少参数by-有什么想法吗?@rfsrc dplyr::summary()没有by参数,因此您加载了一些与
dplyr
冲突的其他包。好的,如果我替换
ep.no=sum(events)
从您的代码到
ep.length=(最后一集(日期)%m+%months(1))-第一集(日期)
,它以天为单位生成该集的持续时间(如数字)。这样做还可以解决年份切换问题,以及以
lubridate::Period
对象结束的问题。最后,您能否在完成后包含您提到的
filter()
位以消除最后一段?此外,虽然我同意将
t0
t1
作为日期对象是有用的,但我计划使用的多状态生存模型可能要求它们是数字的(这是一个时钟重置模型)。
Source: local data frame [10 x 6]
Groups: id [?]

       id episode         t0         t1 ep.length ep.type
    <chr>   <int>     <dttm>     <dttm>     <dbl>   <dbl>
1  group1       1 2016-01-01 2016-04-01        91       1
2  group1       2 2016-04-01 2016-06-01        61       0
3  group1       3 2016-06-01 2016-07-01        30       1
4  group1       4 2016-07-01 2016-09-01        62       0
5  group1       5 2016-09-01 2016-10-01        30       1
6  group1       6 2016-10-01 2017-02-01       123       0
7  group1       7 2017-02-01 2017-03-01        28       1
8  group1       8 2017-03-01 2018-01-01       306       0
9  group2       1 2016-01-01 2016-04-01        91       1
10 group2       2 2016-04-01 2017-01-01       275       0
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets 
[6] methods   base     

other attached packages:
[1] lubridate_1.3.3 dplyr_0.5.0     purrr_0.2.2    
[4] readr_0.2.2     tidyr_0.6.0     tibble_1.2     
[7] ggplot2_2.2.0   tidyverse_1.0.0

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.8      knitr_1.15.1     magrittr_1.5    
 [4] munsell_0.4.2    colorspace_1.2-6 R6_2.1.3        
 [7] stringr_1.1.0    highr_0.6        plyr_1.8.4      
[10] tools_3.3.2      grid_3.3.2       gtable_0.2.0    
[13] DBI_0.5          lazyeval_0.2.0   assertthat_0.1  
[16] digest_0.6.10    memoise_1.0.0    evaluate_0.10   
[19] stringi_1.1.2    scales_0.4.1