在R中创建事件变量的时间

时间:2016-03-22 13:56:53

标签: r

亲爱的所有人:我一直在尝试创建一个事件发生时间变量。的确,前段时间,我向here求助。但是,我发现它并没有完全达到我的目的。

以下是我的数据和我想要创建的变量"活动时间"。

df2 = structure(list(Country = c("USA", "USA", "USA", "USA", "USA", 
"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA"), year = 2000:2012, 
    Event = c(0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 
    0L), `**Time-to-event**` = c(0L, 1L, 2L, 0L, 1L, 2L, 3L, 
    0L, 1L, 0L, 1L, 2L, 3L)), .Names = c("Country", "year", "Event", 
"**Time-to-event**"), row.names = c(NA, -13L), class = "data.frame")

Country  year              Event      **Time-to-event**
USA      2000               0            0
USA      2001               0            1
USA      2002               1            2
USA      2003               0            0
USA      2004               0            1
USA      2005               0            2
USA      2006               1            3
USA      2007               0            0
USA      2008               1            1
USA      2009               0            0
USA      2010               0            1
USA      2011               0            2
USA      2012               0            3

我被建议使用以下代码来创建时间到事件的可变性

i1 <- with(df2, ave(Event, Country, FUN= 
         function(x) cumsum(c(TRUE, diff(x)<0))))
df2$Time_to_event <- with(df2, ave(i1, i1, Country, FUN= seq_along)-1)

它运行良好,但此代码的问题在于它会计算事件连续多年的事件= 1。请参阅下面的示例:

Country  year              Event      **Time-to-event**
USA      2000               0            0
USA      2001               0            1
USA      2002               1            2
USA      2003               0            0
USA      2004               1            **1**
USA      2005               1            **2**
USA      2006               1            **3**
USA      2007               0            0
USA      2008               1            1

相反,我希望它在以下年份的事件变量为1的情况下给出零值(0),而不是计算1&#39; s 要清楚,这就是我希望看到&#34;时间到事件&#34;变量。

Country  year              Event      **Time-to-event**
USA      2000               0            0
USA      2001               0            1
USA      2002               1            2
USA      2003               0            0
USA      2004               0            1
USA      2005               1            2
USA      2006               1            0
USA      2007               1            0
USA      2008               1            0
USA      2009               0            0
USA      2010               0            1

1 个答案:

答案 0 :(得分:3)

您可以按如下方式使用data.table

require(data.table)
setDT(dat)[,tte := seq.int(0,.N-1L), by = cumsum(Event)-Event]

所以你最终得到:

 > dat
    Country year Event **Time-to-event** tte
 1:     USA 2000     0                 0   0
 2:     USA 2001     0                 1   1
 3:     USA 2002     1                 2   2
 4:     USA 2003     0                 0   0
 5:     USA 2004     0                 1   1
 6:     USA 2005     1                 2   2
 7:     USA 2006     1                 0   0
 8:     USA 2007     1                 0   0
 9:     USA 2008     1                 0   0
10:     USA 2009     0                 0   0
11:     USA 2010     0                 1   1

为什么?

让我们看一下组件:

 > dat[,.(Event, cumsum = cumsum(Event), run = cumsum(Event)-Event)]
    Event cumsum run
 1:     0      0   0
 2:     0      0   0
 3:     1      1   0
 4:     0      1   1
 5:     0      1   1
 6:     1      2   1
 7:     1      3   2
 8:     1      4   3
 9:     1      5   4
10:     0      5   5
11:     0      5   5

事件+ cumsum加起来构建运行次数。按此顺序进行分组使其有效。