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

如何在data.frame中执行条件平均,r,aggregate,average,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, ste

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

谢谢。

查看并重新显示您的数据:您使用的格式称为“长”格式,因为每个sessionID有多行-您必须将其转换为宽格式,以获得以下内容:

sessionId, scenarioName, start, step1, step2, end
1001,      A,            0,     2.2,   3.0,   0
1001,      B , ...
...
其他办法:
您可以使用split()(可能两次)将数据拆分为所需的子集,然后计算总和和平均值。

使用
plyr
按场景名称分组并计算所需的统计数据如何:

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作为输出。summary函数创建一个新的data.frame,可以将其视为与transform函数平行的函数。有关更多详细信息,请参见
?汇总
?转换

以下是如何使用
数据。表
。请注意,此解决方案比只有两次启动的情况更通用

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


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

两条评论:1)我不知道这个统计数字的真实含义是什么,但这肯定不是我将如何计算平均值。2) 你算错了。正确的值是8.5/2=4.25关于2),正确的,我在电子表格中犯了一个错误。关于1),你是什么意思?这些数据的真实含义是对web应用程序的性能测试。每个会话由多个场景组成。每个场景由若干步骤组成。我想计算完整场景的平均持续时间。不错!您可能不想硬编码
2
,因为它统计每个场景的
启动次数。