Problem, który próbuję rozwiązać, polega na tym, że mam ramkę danych z posortowaną w niej zmienną POSIX. Każdy wiersz jest podzielony na kategorie i chcę uzyskać różnice czasowe między każdym wierszem dla każdego poziomu i dodać te dane z powrotem do nowej zmiennej. Powtarzalny problem jest jak poniżej. Poniższa funkcja służy tylko do tworzenia przykładowych danych z losowymi czasami dla celów tego pytania.Jak obliczyć różnicę czasu między wierszem a poprzednim wierszem danych.frame według poziomów
random.time <- function(N, start, end) {
st <- as.POSIXct(start)
en <- as.POSIXct(end)
dt <- as.numeric(difftime(en, st, unit="sec"))
ev <- sort(runif(N, 0, dt))
rt <- st + ev
return(rt)
}
Kod dla symulowania tego problemu jest, jak poniżej:
set.seed(123)
category <- sample(LETTERS[1:5], 20, replace=TRUE)
randtime <- random.time(20, '2015/06/01 08:00:00', '2015/06/01 18:00:00')
df <- data.frame(category, randtime)
Oczekiwany Uzyskana ramka danych jest poniżej
>category randtime timediff (secs)
>A 2015-06-01 09:05:00 0
>A 2015-06-01 09:06:30 90
>A 2015-06-01 09:10:00 210
>B 2015-06-01 10:18:58 0
>B 2015-06-01 10:19:58 60
>C 2015-06-01 08:14:00 0
>C 2015-06-01 08:16:30 150
Każda podgrupa w produkcji będzie miał pierwszy rząd z wartością czasową równą 0, ponieważ nie ma poprzedniego wiersza. Udało mi się pogrupować według kategorii i wywołać następującą funkcję, aby obliczyć różnice, ale nie udało mi się zebrać końcowego wyniku dla wszystkich grup kategorii.
getTimeDiff <- function(x) {
no_rows <- nrow(x)
if(no_rows > 1) {
for(i in 2:no_rows) {
t <- x[i, "randtime"] - x[i-1, "randtime"]
}
}
}
Jestem w tym od dwóch dni bez powodzenia, więc bardzo doceniam każdą pomoc. Dzięki.
dzięki za szybką odpowiedź. Rozwiązuje to to częściowo w ustawianiu wydajności zgodnie z wymaganiami. Jednak lag() zwraca poprzedni wiersz jako wartość czasową, a nie faktyczną różnicę. – Mntester
Naprawiono @Mntester. – JasonAizkalns