如何在data.frame中执行条件平均

时间:2011-10-05 09:58:16

标签: r aggregate average

我的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

我想确定按场景分组的从开始到结束的持续时间的平均总和。实现这一目标的最佳方法是什么?

例如,对于情景A,这将是((0 + 2.2 + 3.0 + 0)+(0 + 1.5 + 1.8 + 0))/ 2 = 4.25

感谢。

3 个答案:

答案 0 :(得分:2)

以下是data.table的使用方法。请注意,此解决方案比只有2次启动的情况更为通用。

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


       scenarionName avg_dur
[1,]             A    4.25
[2,]             B    3.20

答案 1 :(得分:0)

查看reshape package并重新调整您的数据:您拥有的格式称为“长”格式,因为每个sessionID都有一行以上 - 您必须将其转换为宽格式,才能获得如下:

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

其他方法: 您可以使用split()(可能两次)在您需要的子集中拆分数据,然后计算总和和平均值。

答案 2 :(得分:0)

如何使用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