亲爱的所有人:我一直在尝试创建一个事件发生时间变量。的确,前段时间,我向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
答案 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加起来构建运行次数。按此顺序进行分组使其有效。