подсчет сумм уникальных значений в логе R - PullRequest
3 голосов
/ 25 августа 2010

У меня есть фрейм данных с тремя столбцами: метка времени, ключ, событие, которое упорядочено по времени.

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

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

Если моя интерпретация верна, то это должно сделать это:

items = data.frame(ts=c(3,8,12,46,100), key=c(12,49,42,12,49), event=c(1,1,1,-1,1))

# numbers of keys that sum to zero, no ddply necessary
nzero <- cumsum(ave(items$event,items$key,FUN=cumsum)==0)

# number of unique keys at a given timepoint
nunique <- rep(F,length(items$key))
nunique[match(unique(items$key),items$key)] <- T
nunique <- cumsum(nunique)

# makes :
items$p <- (nunique-nzero)/nunique

items
   ts key event         p
1   3  12     1 1.0000000
2   8  49     1 1.0000000
3  12  42     1 1.0000000
4  46  12    -1 0.6666667
5 100  49     1 0.6666667
0 голосов
/ 26 августа 2010

Если ваша проблема только в вычислительном времени, я уверен, что лучшей идеей будет реализовать ваш алгоритм как блок C;сначала вы можете использовать R для преобразования ключей в согласованный интервал целых чисел (as.numeric(factor(...))), а затем использовать логический массив в C для простого и очень быстрого получения уникального номера ключа.Помните, что ни plyr, ни стандартные R *pply s не являются значительно более быстрыми, чем циклы (конечно, при условии, что оба используются без смущающих ошибок).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...