2011-10-05 124 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 
相關問題