2012-10-19 39 views
7

vurduğunuzda baştan başlamaksayı satır, ancak koşul I (Zaman numarası ve üzerinde sıralanır) bir dataframe satır belirli birleşimleri sayı istiyorum

tc <- textConnection(' 
id    time  end_yn 
abc    10   0 
abc    11   0 
abc    12   1 
abc    13   0 
def    10   0 
def    15   1 
def    16   0 
def    17   0 
def    18   1 
') 

test <- read.table(tc, header=TRUE) 

gol yeni yaratmaktır 1 to n'dan end_yn == 1'a kadar her satır için id numaralı her satırı numaralandıran sütun ("number"). end_yn == 1'dan sonra numaralandırma baştan başlamalı.

DT <- data.table(test) 
DT[, id := seq_len(.N), by = id] 

Ancak beklenen sonuç olmalıdır:

id    time  end_yn number 
abc    10   0  1 
abc    11   0  2 
abc    12   1  3 
abc    13   0  1 
def    10   0  1 
def    15   1  2 
def    16   0  1 
def    17   0  2 
def    18   1  3 

Nasıl end_yn == 1 koşulu dahil etmek hesaba end_yn == 1 koşulu almadan

satır kullanılarak numaralandırılmış edilebilir? Ben burada yapmak farklı yolları vardır tahmin yürütüyorum ama ediyorum

cevap

5

biri: DT için

anahtar olarak id ayarlama
DT[, cEnd := c(0,cumsum(end_yn)[-.N])] # carry the end value forward 

DT[, number := seq_len(.N), by = "id,cEnd"] # create your sequence 

DT[, cEnd := NULL] # remove the column created above 

değerinde süre kalabiliriz.

+0

Son değeri ileri taşımak için çok akıllı. Bu tam olarak ihtiyacım olan şey ve benim ilk çözümümden çok daha hızlı çalışıyor. Teşekkürler! –

+0

End_yn koşulu gelene kadar tüm girişleri aynı sayıya vermek istersem ne olur? Bu nedenle, ilk kez end_yn = 1 değerine kadar 1, ikinci kez de end_yn = 1 olana kadar 3, sonra 3 vb. (Coockie_id başına) sayı verin. seq_len (.N) değiştirilmesi gerektiğini düşünüyorum, ama ne –

+1

@MaxvanderHeijden ile ne olduğunu anlayamıyorum, bunun için, bir şey gibi deneyebilirsiniz dt [, sayı: = cumsum (end_yn) + 1, by = "id" ] ', ancak' id'nin ilk girişi için '' '' '' '' 'ise' 2' de numaralandırmaya başlayacaktır. SO üzerinde data.table etiketini aramayı deneyin, çünkü benzer bir soru çoktan sorulmuş olabilir. – BenBarnes