我正在准备一个数据集,以通过使用分层Cox回归来拟合条件风险集模型。我想知道是否有任何方法可以创建我需要的变量而无需运行耗时的循环。
基本上,我的数据框是这样的,显示特定国家/地区(ID
)是否以及何时在特定时间段内遇到某些事件:
year ID event time
1991 UK 0 1
1992 UK 0 2
1993 UK 0 3
1994 UK 0 4
1995 UK 0 5
1996 UK 0 6
1997 UK 0 7
1998 UK 0 8
1991 FR 0 1
1992 FR 1 2
1993 FR 1 3
1994 FR 0 4
1995 FR 0 5
1996 FR 1 6
1997 FR 0 7
1998 FR 0 8
1991 IT 1 1
1992 IT 0 2
1993 IT 0 3
1994 IT 0 4
1995 IT 0 5
1996 IT 1 6
1997 IT 0 7
1998 IT 0 8
我需要再创建两个变量:一个条件时间变量,类似于time
,但每次事件发生时都会“重置时钟”;和序列变量,指示国家的顺序或阶段,即下一个事件是第二个,第三个,第四个......(数字应该增加之后事件)。因此,数据看起来像这样:
year ID event time cond.time sequence
1991 UK 0 1 1 1
1992 UK 0 2 2 1
1993 UK 0 3 3 1
1994 UK 0 4 4 1
1995 UK 0 5 5 1
1996 UK 0 6 6 1
1997 UK 0 7 7 1
1998 UK 0 8 8 1
1991 FR 0 1 1 1
1992 FR 1 2 2 1
1993 FR 1 3 1 2
1994 FR 0 4 1 3
1995 FR 0 5 2 3
1996 FR 1 6 3 3
1997 FR 0 7 1 4
1998 FR 0 8 2 4
1991 IT 1 1 1 1
1992 IT 0 2 1 2
1993 IT 0 3 2 2
1994 IT 0 4 3 2
1995 IT 0 5 4 2
1996 IT 1 6 5 2
1997 IT 0 7 1 3
1998 IT 0 8 2 3
任何人都知道如何以一种有效的方式完成这项工作?我试图用ddply
函数来做,但没有找到方法。
答案 0 :(得分:1)
您可以使用data.table
包。如果df
是您的原始data.frame
:
library(magrittr)
library(data.table)
dt = data.table(df)
dt[,temp:=ifelse(is.na(lag(event,1)), as.integer(0), lag(event,1)), by=ID]
dt[, sequence:=cumsum(temp)+1, by=ID]
func = function(x)
{
which(c(1,lag(x,1)[-1]) %in% 1) %>%
c(length(x)+1) %>%
diff
}
dt[, cond.time:=func(event) %>% lapply(seq) %>% unlist, by=ID]
> dt
year ID event time temp sequence cond.time
1: 1991 UK 0 1 0 1 1
2: 1992 UK 0 2 0 1 2
3: 1993 UK 0 3 0 1 3
4: 1994 UK 0 4 0 1 4
5: 1995 UK 0 5 0 1 5
6: 1996 UK 0 6 0 1 6
7: 1997 UK 0 7 0 1 7
8: 1998 UK 0 8 0 1 8
9: 1991 FR 0 1 0 1 1
10: 1992 FR 1 2 0 1 2
11: 1993 FR 1 3 1 2 1
12: 1994 FR 0 4 1 3 1
13: 1995 FR 0 5 0 3 2
14: 1996 FR 1 6 0 3 3
15: 1997 FR 0 7 1 4 1
16: 1998 FR 0 8 0 4 2
17: 1991 IT 1 1 0 1 1
18: 1992 IT 0 2 1 2 1
19: 1993 IT 0 3 0 2 2
20: 1994 IT 0 4 0 2 3
21: 1995 IT 0 5 0 2 4
22: 1996 IT 1 6 0 2 5
23: 1997 IT 0 7 1 3 1
24: 1998 IT 0 8 0 3 2