Рассчитать прошедшие «времена», когда эталонное время зависит от фактора
Я пытаюсь вычислить прошедшее время во фрейме данных, где «начало»; значение прошедшего времени зависит от значения столбца фактора во фрейме данных. (Если говорить просто о вопросе, я буду относиться к временным значениям как к числовым, а не как к объектам времени - мой вопрос о разделении-применении-объединении, а не объектах времени). Мой фрейм данных выглядит так:
df <- data.frame(id=gl(2, 3, 5, labels=c("a", "b")), time=1:5)
Я хотел бы вычислить истекшее время, вычитая минимальное время на каждом уровне фактора из каждого времени (хотя в этом примере я буду иметь дело только с числовыми значениями, а не со значениями времени). Поэтому я хотел бы разделить фрейм данных наid
вычтите минимумy
значение от каждого элемента вy
столбец и возвращает вектор (или фрейм данных) с преобразованными значениями. Я хочу закончить с чем-то вроде:
> dfTrans
id time elapsed
a 1 0
a 2 1
a 3 2
b 4 0
b 5 1
Похоже, идеальная задача для Plyr, но я не могу найти простое решение.
Лучшее, что я могу придумать, это
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
Это не элегантно и кажется хрупким. Конечно, есть лучший способ?