Я пытаюсь вычислить истекшее время в кадре данных, где «старт» значение истекшего времени зависит от значения столбца фактора в кадр данных. (Чтобы просто задать вопрос, я буду обрабатывать значения времени как числовые, а не временные объекты - мой вопрос касается split-apply-comb, а не объектов времени). Мой кадр данных выглядит следующим образом:Вычислить истекшее «раз», где зависит от фактора отсчета время
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
Это некрасиво, и кажется хрупким. Неужели есть лучший способ?
Не использовал бы 'transform' немного более естественным:' ddply (d f,. (id), transform, elapsed = time-min (time)) '? – joran
Возможно. Это не то, о чем я сразу подумал. Я весь день изучаю теорию измерения, и моя голова работает не совсем правильно. – Dason
Ugh. Мои симпатии. Возьмите пиво, которое снова заставит ваш мозг работать. – joran