2015-02-09 1 views
1

Предположим, что у меня есть следующий кадр данных ДФ:BTSCS данные в R: создание т

id year y 
1 1 1990 NA 
2 1 1991 0 
3 1 1992 0 
4 1 1993 1 
5 1 1994 NA 
6 2 1990 0 
7 2 1991 0 
8 2 1992 0 
9 2 1993 0 
10 2 1994 0 
11 3 1990 0 
12 3 1991 0 
13 3 1992 1 
14 3 1993 NA 
15 3 1994 NA 

код для создания ДФ:

id<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3) 
year<-c(1990,1991,1992,1993,1994,1990,1991,1992,1993,1994,1990,1991,1992,1993,1994) 
y<-c(NA,0,0,1,NA,0,0,0,0,0,0,0,1,NA,NA) 
df<-data.frame(id,year,y) 

Я хочу создать следующий вектор т, который измеряет продолжительность наблюдение по риску, пока не произойдет событие (у = 1) или последняя запись о наблюдении (равное право цензурирования):

id year y t 
1 1 1990 NA NA 
2 1 1991 0 1 
3 1 1992 0 2 
4 1 1993 1 3 
5 1 1994 NA NA 
6 2 1990 0 1 
7 2 1991 0 2 
8 2 1992 0 3 
9 2 1993 0 4 
10 2 1994 0 5 
11 3 1990 0 1 
12 3 1991 0 2 
13 3 1992 1 3 
14 3 1993 NA NA 
15 3 1994 NA NA 

Любая помощь приветствуется!

ответ

2

Вот возможный data.table решение, которое будет также обновить набор данных по ссылке

library(data.table) 
setDT(df)[!is.na(y), t := seq_len(.N), id][] 
#  id year y t 
# 1: 1 1990 NA NA 
# 2: 1 1991 0 1 
# 3: 1 1992 0 2 
# 4: 1 1993 1 3 
# 5: 1 1994 NA NA 
# 6: 2 1990 0 1 
# 7: 2 1991 0 2 
# 8: 2 1992 0 3 
# 9: 2 1993 0 4 
# 10: 2 1994 0 5 
# 11: 3 1990 0 1 
# 12: 3 1991 0 2 
# 13: 3 1992 1 3 
# 14: 3 1993 NA NA 
# 15: 3 1994 NA NA 
+1

это было быстро, спасибо! – jsts

0

base R вариант был бы

df$t <- with(df, ave(!is.na(y), id, FUN=cumsum)*NA^is.na(y)) 
df 
# id year y t 
#1 1 1990 NA NA 
#2 1 1991 0 1 
#3 1 1992 0 2 
#4 1 1993 1 3 
#5 1 1994 NA NA 
#6 2 1990 0 1 
#7 2 1991 0 2 
#8 2 1992 0 3 
#9 2 1993 0 4 
#10 2 1994 0 5 
#11 3 1990 0 1 
#12 3 1991 0 2 
#13 3 1992 1 3 
#14 3 1993 NA NA 
#15 3 1994 NA NA 

Или с помощью dplyr

library(dplyr) 
df %>% 
    group_by(id) %>% 
    mutate(t=replace(y, !is.na(y), seq(na.omit(y)))) 
0

Вы можете достичь это с помощью команды btcs() от Dave Armstrong ' ы пакеты DAMisc http://www.inside-r.org/packages/cran/DAMisc/docs/btscs

df <- btscs(df, "y", "year", "id") 

Это выложит исходный набор данных вместе с колонки «заклинанием», который является количество единиц времени с момента последнего события.

 Смежные вопросы

  • Нет связанных вопросов^_^