2011-12-07 15 views
3

とマージする3つの変数、日付、ID、価格の3つのファイルがあります。私は、日付によってそれらを統合したいと思いますので、1つが私の現在のファイルには、次のとおりです。.csvファイルをR

date  ID Price 
01/01/10 A 1 
01/02/10 A 1.02 
01/02/10 A 0.99 
... 
... 

私はIDがA、BおよびCについては、以下のいずれかのように見えますマージされたファイル(価格のためのPr)を取得したいと思い:

date  Pr.A Pr.B Pr.C  
01/01/10 1  NA NA 
01/02/10 1.02 1.2 NA 
01/03/10 0.99 1.3 1 
01/04/10 NA  1.23 2 
01/05/10 NA  NA 3 

一部の日付では価格がないことに注意してください。その場合はNAです。

私の現在のアプローチは動作しますが、私は少し不器用です。

setwd('~where you put the files') 
library(plyr) 
listnames = list.files(pattern='.csv') 
pp1 = ldply(listnames,read.csv,header=T) #put all the files in a data.frame 

names(pp1)=c('date','ID','price') 
pp1$date = as.Date(pp1$date,format='%m/%d/%Y') 

# Reshape data frame so it gets organized by date 
pp1=reshape(pp1,timevar='ID',idvar='date',direction='wide') 

考えられるアプローチはありますか?

+1

後藤http://stackoverflow.com/questions/1562124/merge-many-data-frames-from-csv-files –

+0

ワンノート - リンク先のファイル ' "a1.csv"'いくつかの余分が含まれていますカンマで区切られた、データのない行。私は手でそれらを削除したのではなく、答えでRコードを掘り起こすのではなく、それを削除しました。 –

+0

私が実際にあなたが「改造」したことは、ここではかなり良い選択だと思っています。 – joran

答えて

4

Reduce()のための仕事のように見える:

# Read the files in to a single list, removing unwanted second column from each. 
dataDir <- "example" 
fNames <- dir(dataDir) 
dataList <- lapply(file.path(dataDir, fNames), 
        function(X) {read.csv(X, header=TRUE)[-2]}) 

# Merge them     
out <- Reduce(function(x,y) merge(x,y, by=1, all=TRUE), dataList) 

# Construct column names 
names(out)[-1] <- paste("Pr.", toupper(sub("1.csv", "", fNames)), sep="") 
out 
#  date Pr.A Pr.B Pr.C 
# 1 1/1/2010 1.00 NA NA 
# 2 1/2/2010 1.02 1.20 NA 
# 3 1/3/2010 0.99 1.30 1 
# 4 1/4/2010 NA 1.23 2 
# 5 1/5/2010 NA NA 3 

実際には、あなたのアプローチは、私にはうまく見えますが、私はReduceへの呼び出しで構文のシンプルさと透明性を好む見ることができます。

+0

減速はどのようにスピードの面で機能しますか? –

+0

@PaulHiemstra:私の推測は良くない(各マージ操作のために新しいdata.frameを作成していると思われるので)。私は本当に分かりませんが、スピードが問題になっていたら、私は「Reduce」を提案していないと言います。 –

+0

Reduceを使用する興味深い選択肢。 Rには、この種の関数型プログラミングメソッドが組み込まれていませんでした。 – LouisChiffre

1

私はファイルにアクセスしていませんが、私は企業のファイアウォールの背後にいます。 data.frameをビルドしたら、キャストメソッドを使用します。

res = cast(pp1,date~ID,value="Price",mean) 
関連する問題