Ho una serie di dati che assomiglia a questo:Calcolare le differenze tra le righe più velocemente di un ciclo for?
ID | DATE | SCORE
-------------------------
123 | 1/15/10 | 10
123 | 1/1/10 | 15
124 | 3/5/10 | 20
124 | 1/5/10 | 30
...
Quindi, per caricare il frammento di cui sopra come un frame di dati, il codice è:
id<-c(123,123,124,124)
date<-as.Date(c('2010-01-15','2010-01-01','2010-03-05','2010-01-05'))
score<-c(10,15,20,30)
data<-data.frame(id,date,score)
Sto cercando di aggiungere un colonna che calcola i "giorni dall'ultimo record per questo ID".
In questo momento sto utilizzando un ciclo FOR che sembra qualcosa di simile:
data$dayssincelast <- rep(NA, nrow(data))
for(i in 2:nrow(data)) {
if(data$id[i] == data$id[i-1])
data$dayssincelast[i] <- data$date[i] - data$date[i-1]
}
Esiste un modo più veloce per fare questo? (Ho cercato un po 'in APPLY ma non riesco a capire una soluzione oltre a un ciclo FOR.)
Grazie in anticipo!
Si prega di aggiungere alla domanda l'output di 'dput (testa (dati))'. Le tue date non assomigliano a qualcosa che puoi sottrarre – GSee
Ci sono molti modi per approcciare il pezzo che applica la divisione, ma tutti probabilmente finiranno per usare 'diff'. – joran
@GSee - Non l'ho mostrato, ma ho convertito le date già usando as.Date(). Quanto sopra è solo un dato fittizio per illustrare la struttura. –