Mam zestaw danych, który wygląda tak:Oblicz różnice między rzędami szybciej niż w pętli for?
ID | DATE | SCORE
-------------------------
123 | 1/15/10 | 10
123 | 1/1/10 | 15
124 | 3/5/10 | 20
124 | 1/5/10 | 30
...
Więc załadować powyższy fragment jako ramki danych, kod jest:
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)
Próbuję dodać kolumna, która oblicza "dni od ostatniego rekordu dla tego ID".
Teraz używam pętli FOR, który wygląda mniej więcej tak:
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]
}
istnieje szybszy sposób to zrobić? (Wyglądałem trochę na APLIKACJĘ, ale nie mogę znaleźć rozwiązania poza pętlą FOR.)
Z góry dziękuję!
Proszę dodać do pytania wynik działania 'dput (head (data))'. Twoje daty nie wyglądają jak coś, co możesz odjąć – GSee
Istnieje wiele sposobów podejścia do kawałka split-apply, ale wszystkie z nich prawdopodobnie zakończą się używaniem 'diff'. – joran
@GSee - nie pokazałem tego, ale przekonwertowałem daty już używające jako.Date(). Powyższe dane są jedynie fikcyjnymi danymi do zilustrowania struktury. –