2011-01-19 18 views
6

異なるDBシステムのパフォーマンス評価結果をプロットするためにRを使用したいと考えています。各システムについて、同じデータをロードし、同じクエリをいくつかの繰り返しで実行します。複数のデータフレームにわたって平均を計算する

単一のシステムのデータは次のようになります。私は(プロットするために)今必要

"iteration", "lines", "loadTime", "query1", "query2", "query3" 
1, 100000, 120.4, 0.5, 6.4, 1.2 
1, 100000, 110.1, 0.1, 5.2, 2.1 
1, 50000, 130.3, 0.2, 4.3, 2.2 

2, 100000, 120.4, 0.1, 2.4, 1.2 
2, 100000, 300.2, 0.2, 4.5, 1.4 
2, 50000, 235.3, 0.4, 4.2, 0.5 

3, 100000, 233.5, 0.7, 8.3, 6.7 
3, 100000, 300.1, 0.9, 0.5, 4.4 
3, 50000, 100.2, 0.4, 9.2, 1.2 

何がこれらの測定値の平均値を含む行列またはデータフレームです。私は関数にこのすべてを入れて、ループの平均行列を計算することができ

# read the file 
all_results <- read.csv(file="file.csv", head=TRUE, sep=",") 

# split the results by iteration 
results <- split(all_results, all_results$iteration) 

# convert each result into a data frane 
r1 = as.data.frame(results[1]) 
r2 = as.data.frame(results[2]) 
r3 = as.data.frame(results[3]) 

# calculate the average 
(r1 + r2 +r3)/3 

、私はよりエレガントな存在でなければならないという漠然とした感覚を持っている:私はこれをやっている時点では

溶液。何か案は?

結果が不完全な場合(たとえば、1つの反復の行数が他の繰り返し数よりも少ない場合など)はどうすればよいですか?

ありがとうございます!

答えて

3

。最後に、すべての反復で平均時間を計算するように、各データセットに対してが必要です。その場合は、データセットを識別するall_resultsテーブルに実際に追加の列DataSetが必要です。次のように私たちは、この列を追加することができます。

all_results <- cbind(data.frame(DataSet = rep(1:3,3)), all_results) > all_results DataSet iteration lines loadTime query1 query2 query3 1 1 1 100000 120.4 0.5 6.4 1.2 2 2 1 100000 110.1 0.1 5.2 2.1 3 3 1 50000 130.3 0.2 4.3 2.2 4 1 2 100000 120.4 0.1 2.4 1.2 5 2 2 100000 300.2 0.2 4.5 1.4 6 3 2 50000 235.3 0.4 4.2 0.5 7 1 3 100000 233.5 0.7 8.3 6.7 8 2 3 100000 300.1 0.9 0.5 4.4 9 3 3 50000 100.2 0.4 9.2 1.2 

は今、あなたは簡単に各データセットのロードとクエリ回の平均値を抽出するためにplyrパッケージからddply機能を使用することができます。

> ddply(all_results, .(DataSet), colwise(mean, .(loadTime, query1, query2))) 
    DataSet loadTime query1 query2 
1  1 158.1000 0.4333333 5.7 
2  2 236.8000 0.4000000 3.4 
3  3 155.2667 0.3333333 5.9 

ちなみに、私は非常にあなたがデータ操作の豊富なセットのためにハドレーウィッカムのplyr packageを見てお勧めします

+0

実際にはループよりもエレガントです...ヒントのおかげです。 – behas

+0

ddplyの出力フレームに "lines"列を含める場合はどうすればよいですか?私は単純に線上で平均を計算することでそれを行うことができます。行番号は静的な値であるため、これは何らかの意味を持ちません。 – behas

+0

私はあなたが何を意味するのか見ていますが、私は同じ値の束の "平均"を取ることに害はないと思います! –

0

てみてください、例えば、

with(all_results, tapply(lines, iteration, mean)) 
1

は、あなたが心の中でこのような何かを持っていましたか?

私が正しくあなたを理解していれば、与えられたDBシステム上で、各「反復」(1 ... N)であなたがデータセット(1,2,3)の配列をロードし、それらのクエリを実行している
do.call("rbind", lapply(results, mean)) 
1

はこの試し機能:また、アンバランスのために働く

> Reduce("+", results)/length(results) 
    DataSet iteration lines loadTime query1 query2 query3 
1  1   2 1e+05 158.1000 0.4333333 5.7 3.033333 
2  2   2 1e+05 236.8000 0.4000000 3.4 2.633333 
3  3   2 5e+04 155.2667 0.3333333 5.9 1.300000 

aggregateソリューションをケースが続く。任意の反復のi番目の行がデータセットi用であり、データセット内で単純に平均すると仮定します。 aggregateを使用するのは簡単です。唯一の難しい部分は、データセットへの行の割り当てを正しくして、不均衡なケースでも機能するようにすることです。これはlist(data.set = ...)の式によって行われます。あなたはiterationall_resultsを分割する必要がある理由

> it <- all_results$iteration 
> aggregate(all_results, list(data.set = seq_along(it) - match(it, it) + 1), mean) 
    data.set iteration lines loadTime query1 query2 query3 
1  1   2 1e+05 158.1000 0.4333333 5.7 3.033333 
2  2   2 1e+05 236.8000 0.4000000 3.4 2.633333 
3  3   2 5e+04 155.2667 0.3333333 5.9 1.300000 
+0

私は同じことを提案しようと考えていましたが、すべての 'data.frame'が同じサイズでなければ' + 'は動作しません。 –

+0

投稿されたコードは機能するが、彼は何か「よりエレガントな」ものを望んでいることをポスターが示して以来、データフレームは同じサイズです。 –

+0

@Gabor私は彼の質問の最後の文章を引用していました。 –

3

私は表示されません。 all_resultsにはaggregateを使用できます。すべての反復で同じ数の観測を行う必要はありません。

Lines <- "iteration, lines, loadTime, query1, query2, query3 
1, 100000, 120.4, 0.5, 6.4, 1.2 
1, 100000, 110.1, 0.1, 5.2, 2.1 
1, 50000, 130.3, 0.2, 4.3, 2.2 
2, 100000, 120.4, 0.1, 2.4, 1.2 
2, 100000, 300.2, 0.2, 4.5, 1.4 
2, 50000, 235.3, 0.4, 4.2, 0.5 
3, 100000, 233.5, 0.7, 8.3, 6.7 
3, 100000, 300.1, 0.9, 0.5, 4.4 
3, 50000, 100.2, 0.4, 9.2, 1.2" 

all_results <- read.csv(textConnection(Lines)) 

aggregate(all_results[,-1], by=all_results[,"iteration",drop=FALSE], mean) 
+0

私は答えが "反復"ではなく(100000行と50000行のデータセットの平均をとるのは意味がない)、私の答えで言ったように、OPはDataSetで平均する必要があると思います。少なくともそれは彼が本当にやりたいことの私の解釈です。 –

+0

...しかし、 'aggregate'を使う考えはいいですが(+1)。私は 'plyr'を使って練習するための練習としてこれを使用しようとしていました。 –

関連する問題