我的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
感谢。
答案 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
。