2012-06-24 2 views
0

Я пытаюсь вычислить истекшее время в кадре данных, где «старт» значение истекшего времени зависит от значения столбца фактора в кадр данных. (Чтобы просто задать вопрос, я буду обрабатывать значения времени как числовые, а не временные объекты - мой вопрос касается 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 

Это некрасиво, и кажется хрупким. Неужели есть лучший способ?

ответ

3

Функция «пр» является первым, что вы должны думать о том, когда результаты должен быть вектор той же длины, что и количество строк в фрейме данных:

df$elapsed <- ave(df$time, df$id, FUN=function(x) x -min(x)) 
df 
    id time elapsed 
1 a 1  0 
2 a 2  1 
3 a 3  2 
4 b 4  0 
5 b 5  1 
2

Вот это ddply Раствора

ddply(df, .(id), summarize, time = time, elapsed = seq(length(id))-1) 

и один с помощью RLE вместо

df$elapsed <- unlist(sapply(rle(as.numeric(df$id))$lengths, seq))-1 
+0

Не использовал бы 'transform' немного более естественным:' ddply (d f,. (id), transform, elapsed = time-min (time)) '? – joran

+0

Возможно. Это не то, о чем я сразу подумал. Я весь день изучаю теорию измерения, и моя голова работает не совсем правильно. – Dason

+0

Ugh. Мои симпатии. Возьмите пиво, которое снова заставит ваш мозг работать. – joran

Смежные вопросы