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
?
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! –
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 –
@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