2012-10-19 11 views
7

voglio annoverare alcune combinazioni di fila in un dataframe (che è ordinato su ID e in tempo)numero righe per variabile, ma ricominciare quando la condizione viene colpito

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) 

L'obiettivo è quello di creare un nuovo colonna ("number") che numera ogni riga per id da 1 to n finché non viene colpito il numero end_yn == 1. Dopo end_yn == 1, la numerazione dovrebbe ricominciare.

Senza prendere la condizione end_yn == 1 in considerazione le righe possono essere numerate utilizzando:

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

Tuttavia il risultato atteso dovrebbe essere:

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 

come incorporare la condizione end_yn == 1?

risposta

5

Sto indovinando ci sono diversi modi per farlo, ma qui è uno:

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 

Impostazione id come la chiave per DT potrebbe valere la pena.

+0

Molto intelligente per portare avanti il ​​valore finale. Questo è esattamente ciò di cui ho bisogno e funziona molto più velocemente della mia soluzione iniziale. Grazie! –

+0

E se volessi dare a tutte le voci lo stesso numero fino a quando non viene colpita la condizione end_yn? Quindi dai il numero 1 al valore end_yn = 1 per la prima volta, poi 2 fino a end_yn = 1 per la seconda volta, poi 3 ecc. (Per coockie_id). seq_len (.N) deve essere sostituito, penso, ma non riesco a capire con cosa sia –

+1

@MaxvanderHeijden, per questo, si potrebbe provare qualcosa come 'DT [, numero: = cumsum (end_yn) + 1, by =" id " ] ', ma inizierebbe la numerazione in' 2' se 'end_yn' è' 1' per la prima voce di un 'id'. Prova a cercare il tag data.table su SO, dal momento che una domanda simile potrebbe essere già stata posta. – BenBarnes

Problemi correlati