Calcule os "tempos" decorridos, em que o tempo de referência depende de um fator

Eu estou tentando calcular os tempos decorridos em um quadro de dados, onde o valor de 'início' para o tempo decorrido depende do valor de uma coluna de fator no quadro de dados. (Para simplificar a pergunta, tratarei os valores de tempo como objetos numéricos em vez de tempo - minha pergunta é sobre dividir-aplicar-combinar, não objetos de tempo). Meu quadro de dados é assim:

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

Eu gostaria de calcular os tempos decorridos subtraindo o tempo mínimo em cada nível de fator de cada vez (embora, por causa deste exemplo, eu lidarei apenas com valores numéricos, não valores de tempo). Então, eu gostaria de dividir o quadro de dados porid, subtrair o mínimoy valor de cada elemento noy coluna e retornar um vetor (ou quadro de dados) com os valores transformados. Eu quero acabar com algo como:

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

Parece uma tarefa perfeita para plyr, mas não consigo encontrar uma solução simples.

O melhor que posso encontrar é

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

Isso é deselegante e parece frágil. Certamente há um caminho melhor?

questionAnswers(2)

yourAnswerToTheQuestion