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?