2012-10-19 8 views
7

ich bestimmte Kombinationen von Zeile in einem Datenrahmen nummerieren möchten (die auf ID und auf Zeit bestellt wird)Anzahl Zeilen durch variable, aber von vorn beginnen, wenn die Bedingung getroffen wird

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) 

Das Ziel ist es, eine neue zu erstellen Spalte ("number"), die jede Zeile pro id von 1 to n bis end_yn == 1 nummeriert ist. Nach end_yn == 1 sollte die Nummerierung von vorne beginnen.

Ohne den end_yn == 1 Zustand unter Berücksichtigung der Reihen können mit nummeriert werden:

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

jedoch das erwartete Ergebnis sein sollte:

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 

Wie die end_yn == 1 Zustand zu übernehmen?

Antwort

5

Ich vermute, es gibt verschiedene Wege, dies zu tun, aber hier ist eine:

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 

Einstellung id als Schlüssel für DT könnte sich lohnen.

+0

Sehr schlau, um den Endwert vorwärts zu tragen. Genau das brauche ich und arbeite viel schneller als meine ursprüngliche Lösung. Vielen Dank! –

+0

Was wäre, wenn ich allen Einträgen die gleiche Nummer geben möchte, bis die end_yn-Bedingung erreicht ist? Geben Sie also den Wert 1 bis zum ersten Mal end_yn = 1, dann 2 bis end_yn = 1 für das zweite Mal, dann 3 usw. (per coockie_id). seq_len (.N) muss ersetzt werden, denke ich, aber ich kann nicht herausfinden, was –

+1

@MaxvanderHeijden, dafür könnte man etwas wie DT versuchen [, number: = cumsum (end_yn) + 1, by = "id" ] ', aber das würde beginnen, bei' 2' zu nummerieren, wenn 'end_yn'' 1' für den ersten Eintrag einer 'id' ist. Versuchen Sie, das data.table-Tag auf SO zu durchsuchen, da eine ähnliche Frage möglicherweise bereits gestellt wurde. – BenBarnes