2011-10-05 85 views
1

执行条件平均有R数据:,看起来像这样我如何在data.frame

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

两条评论:1)我不知道这个统计的实际意义是什么,但它肯定不是我如何计算平均值。 2)你添加的不正确。正确的值是8.5/2 = 4.25 – Andrie

+0

关于2),正确的,我在电子表格中犯了一个错误。 – Andrej

+0

关于1),你是什么意思?这些数据的真实世界含义是对Web应用程序的性能测试。每个会话都由多个场景组成。每种场景都由多个步骤组成。我想计算完整场景的平均持续时间。 – Andrej

回答

0

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

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

其他方法: 你可以使用分裂()(可能是两次)在您需要的子集分割你的数据,然后计算出的数额和的平均值。

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作为输出。汇总函数创建一个新的数据框架,并且可以视为转换函数的并列。有关更多详细信息,请参阅?summarize?transform

+0

不错的一个!你可能不想硬编码'2',因为它计算每个场景的'starts'的数量。 – Ramnath

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 
相关问题