2016-03-22 8 views
2

親愛なるすべて:私はイベント間変数を作成しようとしていました。実際、以前は、hereに助けを求めました。しかし、私はそれが私の目的を完全に果たしていないことを発見しました。イベント変数への時間をRに作成

以下は自分のデータと変数を作成する変数です。

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 

私はそれがうまく働いたが、このコードの問題は、それがどこのイベント例を数えることであるタイム・トゥ・イベントvaraible

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の を数えるよりも、次の年のイベント変数が1である場合のために(0)ゼロの値を与えるためにそれをしたいと思い、これは私が "イベントへの時間"変数を見たいと思う方法です。

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 

答えて

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は、実行の数を構築するまで追加:

は、コンポーネントを見てすることができます。このシーケンスでグループ化すれば動作します。

+0

こんにちは@ Floo0と私にこれを共有してくれてありがとう。私はこれを試してみました。**未使用の引数(by = rleid(cumsum(Event) - Event))**。 "tte"はどういう意味ですか? – FKG

+2

'cumsum(shift(Event、fill = 1L))'は 'by ='に入れることができる別のものです。 – Frank

+2

@FKGまず、そのエラーがなくなるために 'setDT(df2)'が必要です。 'tte'は単に" time to event "を省略しています。 – Frank

関連する問題