2017-02-22 4 views
0

にデータフレームにマージ:複数のxlsxファイルを読み込むと、私は、コードを書いているR

  • は、フォルダ

  • ソートのリストを読み込み、リストから特定のテキスト要素を持つフォルダを抽出

  • 各ファイル内のタブ/シートを見つける各フォルダから

  • を完全なファイル名を取得

  • ループ/ lapply read.xlsx()に列を作成中のファイル

の私のネストされたリスト上究極の目標は、それぞれのフォルダから、それぞれのファイルからすべてのタブ/シートを読むことですどのタブ/シートであるかを識別し、どのフォルダから取得したかを識別し、それらをすべて1つにまとめます。

私の推奨するExcelファイルのパッケージは、「openxlsx」です。

はここでフォルダやファイルを取得するための私のコードです:私がループすることができませんでした

path<- "/Users/jackserna/Google Drive/Folder" 
dataFolders<- list.files(path) 
dataFolders<- sort(dataFolders[starts_with(match = "FY", vars = dataFolders)]) 
files<- lapply(lapply(dataFolders, FUN = function(x){ 
    paste(path,x,sep = "/") 
    }), FUN = function(x){ 
      list.files(x, pattern = "*.xlsx", full.names = TRUE) 
}) 

/私のすべてのファイルとすべての私のシートの読み取り機能を適用します。私は1つ以上のフォルダを読んだり、それを繰り返さなければならなかった。私はしかし、このアプローチは私が私が読ん各シートのための余分な列としてシート名を追加することはできません... this postから

data.to.merge <- lapply(lapply(files[[1]], FUN = function(x){ 
    read.xlsx(x, sheet = 3, cols = 1:5) 
}), na.omit) 
merged.daata <- Reduce(function(...) merge(..., all = T), data.to.merge) 

をいくつかのコードを使用していました。このアプローチは、シート#3にデータがあることを前提としていしかし、これらのファイルではそうではありません。データはシート全体に分散され、一部のシートはマージするために無視する必要があります。

すべてのシートをつかむと、私はしたくないシートを解析する試みでは、ここで行われたものです。

allsheets<- list() 
for(i in files){ 
    for(j in i){ 
    sheets<- getSheetNames(j) 
    allsheets<- cbind(allsheets,sheets) 
    } 
} 

しかし、これは読書のために使用できるように悪夢になっており、合併。

私は達成しようとしていることをRに理解させるにはどうすればよいですか?

答えて

0

私はあなたの別々の機能については分かれているので、何かがうまくいかない場所を追いかけることができます。また、Excelのパッケージの後にメモリを集中させるR機会を与えることもできます。すべてを1つのコマンドにプッシュすると、うまく動作しなくなります。

あなたのお気に入りのパッケージを使用してメモリにsheet_listを読んでたら、これはそれを行う必要があります。

for (i in sheet_list({ 
new_sheet<- your_read_command(sheet_list[i]) 
    #subsitute using whatever reader package command you use likexlConnect or xlsx 
new_sheet$sheetname<- i #(adding the column with sheet name prior to binding) 
data<-rbind(data, new_sheet) 
rm(new_sheet) 
gc()}` 

rm() & gc()は、ここでは大規模重要です。すべてのExcelリーダーがJARSベースであり、HOGメモリーがシステムをクラッシュさせていることがわかります。データがバインドされた後に各オブジェクトを削除し、クロールから停止またはフラットアウトにぶつからないようにガベージコレクトします。

私はCSVで部品をテストしていて、うまくいきました。今すぐExcelパッケージを使用して、ちょっとした調整が必要です。コメントを投稿するのに助けが必要な場合... data < -data.frame() `を作成し、ループに入る前にすべての列名を割り当ててください。バインドするものをループしてください!

+0

私はこのループを試しています: 'data < - setNames(data.frame(matrix ncol = 207、nrow = 0))、column_names) wksheets < - list.files(recursive = T、pattern = ' における(jについて:loadWorkbook(wksheets [I]) sheetnames < - - - getSheets(NEW_FILE) sheetnames

+0

この解決方法を試してください:http://stackoverflow.com/questions/15825004/xlconnect-loadworkbook-error-poixmlexception-java – sconfluentus

0

さらに、readxlというパッケージをお勧めします。おそらく、ワークシート内のシート数を検出することはできませんが、XLConnectを使用してシートを検出した後で使用できます。私がされているテキスト、数値または日付のどちらかとしてインポートする各列の列タイプを定義し、警告を取り除くために

library(data.table) 
my.monthly.excel.files <- "../../../../../../Documents/Output/Monthly/" 
my.file.list <- data.table(File.Name = list.files(path = my.monthly.excel.files , pattern = ".xlsx$" , recursive = FALSE, include.dirs = FALSE)) 
rbindlist(lapply(my.file.list[,File.Name], function(file){print(file); read_excel(path = paste0(my.monthly.excel.files, file), sheet = "sheet_name")})) 

+0

私はopenxlsx、XLconnectを試しました、readxlのようになりますが、廃止された関数には不満があります。 XLconnectは一貫して動作しているようです。皆さんの情報のために、私はRバージョン3.3.2、openxlsxバージョン4.0.0、XLconnectバージョン0.2-12、およびreadxlバージョン0.1.1を使用しています。実行中のバージョンを指定しない限り、data.tableやrbindlistのような廃止予定の関数は使用しないでください。私はあなたがtbl_df()を意味していると思っていましたが、それは理にかなっていませんが、 "my.file.list [、File.Name]"という構文で意味があります。私が受け取っている出力に関しては、「エラー:データフレームが壊れています」 –

+0

うわー、2つのコマンド 'data.table'と' rbindlist'はdata.tableパッケージの一部です。それが廃止されたものではないため、現在の呼び出しを追加しました。 – hannes101

1

私はこの特定のデータを悪夢では解決できませんでしたが、翌年の準備で私はファイル構造をいくつか変更しました。私はdata.tableパッケージがネストされたリストをデータフレームのようなものにするのに本当に便利であることを発見しました。

すべてのデータは、指定された1つのシート名(または番号)からのみ読み取られることに注意してください。

### Get list of folder names 
dataFolders<- list.files(path = path) 
dataFolders<- sort(dataFolders[starts_with(match = "FY", vars = dataFolders)]) 

### Get list of files for each regional folder 
files<- lapply(lapply(dataFolders, FUN = function(x){ 
    paste(path,x,sep = "/")}), FUN = function(x){ 
      list.files(x, pattern = "*.xlsx", full.names = TRUE) 
}) 

dataPrep<- lapply(files, FUN = function(x){ 
    lapply(lapply(x, FUN = function(x){ 
      read.xlsx(x, sheet = "Sheet Name", cols = 1:6)}), na.omit) 
}) 
transform<- rbindlist(lapply(dataPrep, FUN = function(x){ 
    rbindlist(x, use.names = TRUE) 
}), use.names = TRUE) 

には悪夢のような解決策はありませんが、それはデータ入力の標準である必要があります。

関連する問題