Как выполнить условное усреднение в data.frame - PullRequest
1 голос
/ 05 октября 2011

У меня есть данные R, которые выглядят так:

row, sessionId, scenarionName, stepName, duration
1, 1001, A, start, 0
2, 1001, A, step1, 2.2
3, 1001, A, step2, 3.0
4, 1001, A, end, 0
5, 1001, A, start, 0
6, 1002, B, start, 0
7, 1002, B, step1, 1.1
8, 1001, A, step1, 1.5
9, 1001, A, step2, 1.8
10, 1001, A, end, 0
11, 1002, B, step2, 2.1
12, 1002, B, end, 0

Я хочу определить среднюю сумму продолжительности от начала до конца, сгруппированную по сценарию.Какой лучший способ добиться этого?

Например, для сценария А это будет ((0 + 2,2 + 3,0 + 0) + (0 + 1,5 + 1,8 + 0)) / 2 = 4,25

Спасибо.

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Вот как это сделать с data.table. Обратите внимание, что это решение является более общим, чем ваш случай, когда есть только 2 запуска.

dt[,list(avg_dur = sum(duration)/sum(stepName == ' start')),'scenarionName']


       scenarionName avg_dur
[1,]             A    4.25
[2,]             B    3.20
0 голосов
/ 05 октября 2011

Как насчет использования plyr для группировки по scenarionName и вычисления запрошенной статистики:

library(plyr)
ddply(dat, "scenarionName", summarize, newVal = sum(duration) / 2)

> ddply(dat, "scenarionName", summarize, newVal = sum(duration) / 2)
  scenarionName newVal
1             A   4.25
2             B   1.60

Ключ в том, что ddply ожидает data.frame в качестве входных данных и переменную (и) группировки. Он вернет data.frame в качестве вывода. Функция суммирования создает новый data.frame и может рассматриваться как параллельная функция преобразования. Подробнее см. ?summarize и ?transform.

0 голосов
/ 05 октября 2011

посмотрите на измените пакет и измените ваши данные: ваш формат называется «длинным» форматом, так как у вас есть более одной строки для каждого sessionID - вы должны преобразовать его в широкоформатный, чтобы получить следующее:

sessionId, scenarioName, start, step1, step2, end
1001,      A,            0,     2.2,   3.0,   0
1001,      B , ...
...

Другой подход: вы можете использовать split () (возможно, дважды), чтобы разбить ваши данные на нужные вам поднаборы, а затем вычислить суммы и средние значения.

...