R从事件数据创建时变生存数据集
我想创建一个具有多个记录ID的生存数据集。现有事件数据由一行观测数据组成,日期格式为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
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