2016-07-05 9 views
4

複数のxlsxを読み込んで組み合わせる方法について読んでいます。ファイルを1つのRデータフレームに変換して、How to read multiple xlsx file in R using loop with specific rows and columnsのような非常に良い提案が出てきましたが、今までのデータセットには当てはまりません。複数のxlsxファイルを複数のシートで1つのRデータフレームに読み込む

私は、複数のxlsxファイルを複数のシートで読み込むことをお勧めします。すべてのシートとファイルは同じ列を持ちますが、同じ長さではなく、NAは除外してください。

19、12:17、6、8時10分これまでのところ、私が試した:私は、最初の3行をスキップし、列だけで1を取りたい

file.list <- list.files(recursive=T,pattern='*.xlsx') 

dat = lapply(file.list, function(i){ 
    x = read.xlsx(i, sheetIndex=1, sheetName=NULL, startRow=4, 
       endRow=NULL, as.data.frame=TRUE, header=F) 
# Column select 
    x = x[, c(1:6,8:10,12:17,19)] 
# Create column with file name 
    x$file = i 
# Return data 
    x 
    }) 

    dat = do.call("rbind.data.frame", dat) 
をしかし、これが唯一のすべての最初を取りますすべてのファイルのシート

1つのRデータフレームですべてのシートとファイルを一緒に取得する方法を知っている人はいますか?

また、大きなデータセットにはどのようなパッケージをお勧めしますか?これまではreadxlとXLConnectを試しました。

ありがとうございます!

+1

あなたが明示的にあなたの関数にのみ最初のシートを求めている: のx = read.xlsx(I、* sheetIndex = 1 *、...) – mkt

+1

また、大規模なデータセットの速度を最適化する場合は、data.tableパッケージを調べる価値があります。とりわけ、fread関数を使うと、すべての列を読み込んだ後でサブセット化するのではなく、必要な列だけを読み込むことができます。しかし、私はそれが.xlsxファイルではうまくいくとは思っていません。 – mkt

+0

あなたのlapplyはファイルをループしています。あなたが望むものを得るためにシート上に2番目のループを張る必要があります。 – Choubi

答えて

2

このようなネストループを使用して、各ファイルの各シートを調べます。 これは最速の解決策ではないかもしれませんが、最も簡単です。

require(xlsx)  
file.list <- list.files(recursive=T,pattern='*.xlsx') #get files list from folder 

for (i in 1:length(files.list)){           
    wb <- loadWorkbook(files.list[i])   #select a file & load workbook 
    sheet <- getSheets(wb)      #get sheet list 

    for (j in 1:length(sheet)){ 
    tmp<-read.xlsx(files.list[i], sheetIndex=j, colIndex= c(1:6,8:10,12:17,19), 
        sheetName=NULL, startRow=4, endRow=NULL, 
        as.data.frame=TRUE, header=F) 
    if (i==1&j==1) dataset<-tmp else dataset<-rbind(dataset,tmp) #happend to previous 

    } 
} 

ローディングフェーズ後にNA値をクリーニングすることができます。

+0

ありがとう!それは私のためにはうまくいっていない。私は警告が表示されます:charToDate(x)のエラー: 文字列が標準的な明確な形式ではありません – Elisah

+0

これは、日付変数の書式設定時にすべてを読み込んだ後に表示されるエラーのようです。このエラーでは、通常、日付変数を標準形式に変換する必要があります。 [this post](http://stackoverflow.com/questions/14755425/what-are-the-standard-unambiguous-date-formats)を参照してください。 – GPierre

+0

また、あなたの列のクラスを推測しようとしているRから来て、誤って日付であると仮定することもできます( '?read.xlsx'を参照)。その場合は、 'colClasses'引数を使用してすべての列を強制的に文字列としてロードすることをお勧めします。そして、すべてがロードされた後でデータをクリーンアップします(正しいクラスを指定してください..)。 – GPierre

3

openxlsxソリューション:

filename <-"myFilePath" 

sheets <- openxlsx::getSheetNames(filename) 
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename) 
names(SheetList) <- sheets 
+0

これはもっと速くて洗練されたソリューションだと思います!ありがとう! – SeanM

関連する問題