R 中的 BTSCS 数据:创建 t

BTSCS data in R: create t

假设我有以下数据框 df:

   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

创建 df 的代码:

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)

我想创建以下向量 t 来测量观察在事件发生 (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

非常欢迎任何帮助!

这是一个可能的 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

一个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))))   

您可以使用 Dave Armstrong 的软件包 DAMisc 中的 btcs() 命令实现此目的。

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

这将吐出您的原始数据集以及一列 'spell',这是自上次事件以来的时间单位数。