2012-03-21 17 views
11

こんにちは私は処理するCSVファイルがたくさんあります。各ファイルはアルゴリズムの実行によって生成されます。データフレームをRに統合

CSV1:

 index value 
    1  1  1 
    2  2  1 
    3  3  1 
    4  4  1 
    5  5  1 

CSV2:

 index value 
1  4  3 
2  5  3 
3  6  3 
4  7  3 
5  8  3 

は今、私はこのように、これらのCSVデータを集計したい:

私のデータは、常に1つのキーと、このような値を持っています

両方のファイルに同じキーが含まれている場合結果の行には、ファイルshare(5)と両方の値の平均((1 + 3)/ 2 = 2)の両方のキーが含まれている必要があります。 1つのファイルにキー(たとえば2)が含まれている場合、この行は結果テーブルに追加されます(key = 2、value = 1)。このような

何か:まず

 index value 
1  1  1 
2  2  1 
3  3  1 
4  4  2 (as (1+4)/2 = 2) 
5  5  2 (as (1+4)/2 = 2) 
6  6  3 
7  7  3 
8  8  3 

データのみを連結して、私はrbind()が仕事をしていませんと思ったが、それは値を集計しません。どのように私はRでそれを達成することができますか?

+5

'rbind'、次に' aggregate' – James

+3

これはおそらく、2つの別々のステップで行う必要があります - 1)値を1つの構造体(rbindを使って行ったもの)と2)インデックスに基づいて集計します。あなたはddply(plyrパッケージから)やtapplyやaggregateのようなものを使って簡単にステップ2を行うことができます。 – Dason

+4

'aggregate(。index、data = rbind(data1、data2)、mean)を使用しています。 –

答えて

13

ここに解決策があります。私はこれまでのすばらしいコメントに従っています。任意の数のファイルを処理する方法を示すことで、価値を付け加えることを願っています。私は同じディレクトリ(下のmy.csv.dir)にすべてのcsvファイルがあると仮定しています。

# locate the files 
files <- list.files(my.csv.dir) 

# read the files into a list of data.frames 
data.list <- lapply(files, read.csv) 

# concatenate into one big data.frame 
data.cat <- do.call(rbind, data.list) 

# aggregate 
data.agg <- aggregate(value ~ index, data.cat, mean) 

編集:私は質問から理解している何

files  <- list.files(my.csv.dir) 
algo.name <- sub("-.*", "", files) 
data.list <- lapply(files, read.csv) 
data.list <- Map(transform, data.list, algorithm = algo.name) 
data.cat <- do.call(rbind, data.list) 
data.agg <- aggregate(value ~ algorithm + index, data.cat, mean) 
+0

thxこの素敵なスクリプトです。私は来週それを試してみましょう! –

+0

私はこの問題に追加しました。私はこれらのcsvファイルを生成する複数のアルゴリズムを持っています。私のCSVファイル名は、このようになります: 'algorithm1-values-run1.csv、algorithm1-values-run2.csv、algorithm2-values-run1.csv、algorithm2-values-run2.csv'。今度はすべてのCSVファイルを読み込み、アルゴリズムで集約したいと思っています。だから私はリストやこれのようなもののリストを作成します。また、アルゴリズム名を保持する必要があります。 –

+0

私はそれが2年経っていることを知っていますが、あなたがまだ興味があるなら、あなたの余分な要求を処理しました。私の答えを受け入れることを検討してください。 – flodel

0

あなたはdata.frameのリストが含まれていますリストをしたいということである:以下、あなたのコメントにあなたの更新の問題を処理しますcsvファイルまたはtxtファイルの中から選択し、集約します。

ディレクトリを作成し、フォルダ内のすべてのcsvファイルとtxtファイルを削除します。 次のコマンドを実行して、結果をlistに取得します。

リットル=のlist.files(パターン= "CSV")

このLオブジェクトが

M =マップ(read.csv、L CSVファイルの名前が含まれています)

このマップ関数は、read.csv関数をすべてのcsvファイルにマップし、mオブジェクトにはlistのdata.frameとしてcsvファイルが含まれます。

dat = do。コール(rbind、m)の

は今

ライブラリ(plyr)

RES = ddply(DAT、〜インデックス、値=平均(値)をまとめたもの)

plyrライブラリを呼び出します

これは、オブジェクトが、私はこれがあなたの欲求の結果を得るためにあなたを助けることを願っ集計値

が含まれていますresは。