У меня есть фрейм данных с тремя столбцами: метка времени, ключ, событие, которое упорядочено по времени.
ts,key,event
3,12,1
8,49,1
12,42,1
46,12,-1
100,49,1
Исходя из этого, я хочу создать фрейм данных с отметкой времени и (все уникальные ключи - все уникальные ключи с совокупной суммой от 0 до заданной отметки времени), разделенные на все уникальные ключи до одной и той же отметки времени. Например. для приведенного выше примера результат должен быть:
ts,prob
3,1
8,1
12,1
46,2/3
100,2/3
Мой начальный шаг - вычислить сумму, сгруппированную по ключу:
items = data.frame(ts=c(3,8,12,46,100), key=c(12,49,42,12,49), event=c(1,1,1,-1,1))
sumByKey = ddply(items, .(key), transform, sum=cumsum(event))
На втором (и последнем) шаге я повторяю цикл sumByKey
с циклом for и отслеживаю как все уникальные ключи, так и все уникальные ключи, которые имеют 0 в своей сумме, используя векторы, например, if(!(k %in% uniqueKeys) uniqueKeys = append(uniqueKeys, key)
. Проба получена с использованием двух векторов.
Первоначально я пытался решить второй шаг, используя plyr, но я хотел избежать повторного вычисления уникальных ключей до определенной отметки времени для каждой строки в sumByKey
. Что мне не хватает, так это способ ссылаться на внешние переменные из функции, переданной в ddply. Или, альтернативно (и более функционально), используйте аккумулятор, переданный обратно в функцию, например, функция (акк, х) акк + х.
Можно ли решить второй шаг лучше, например, используя ddply