Oblicz „minione” czasy, w których czas odniesienia zależy od czynnika

Próbuję obliczyć czasy, które upłynęły w ramce danych, gdzie wartość „start” dla czasu, który upłynął, zależy od wartości kolumny czynnika w ramce danych. (Aby po prostu zadać pytanie, będę traktował wartości czasu jako obiekty numeryczne, a nie czasowe - moje pytanie dotyczy obiektów split-apply-Combine, a nie obiektów czasu). Moja ramka danych wygląda tak:

df <- data.frame(id=gl(2, 3, 5, labels=c("a", "b")), time=1:5)

Chciałbym obliczyć czasy, które upłynęły, odejmując minimalny czas w każdym poziomie współczynnika od każdego czasu (chociaż dla tego przykładu zajmę się po prostu wartościami liczbowymi, a nie wartościami czasu). Chciałbym więc podzielić ramkę danych wedługid, odejmij minimumy wartość z każdego elementu wy kolumna i zwróć wektor (lub ramkę danych) z przekształconymi wartościami. Chcę skończyć z czymś w rodzaju:

> dfTrans
id  time  elapsed
a      1        0
a      2        1
a      3        2
b      4        0
b      5        1   

Wydaje się, że jest to idealne zadanie dla plyr, ale nie mogę znaleźć prostego rozwiązania.

Najlepsze, co mogę wymyślić, to

elapsed <- dlply(df, .(id), function(x) x$time - min(x$time))
elapsed_comb <- NA
for(i in 1:length(names(elapsed))) {
  elapsed_comb <- c(elapsed_comb, elapsed[[i]])
}
elapsed_comb <- elapsed_comb[-1]
df$elapsed <- elapsed_comb

To jest nieeleganckie i wydaje się kruche. Z pewnością jest lepszy sposób?

questionAnswers(2)

yourAnswerToTheQuestion