2016-07-05 10 views
4

Ich habe gelesen, wie man mehrere xlsx liest und kombiniert. Dateien in einen R-Datenrahmen und sind auf einige sehr gute Vorschläge wie How to read multiple xlsx file in R using loop with specific rows and columns gestoßen, aber passt nicht zu meinem Datensatz bisher.Mehrere xlsx-Dateien mit mehreren Blättern in einem R-Datenrahmen lesen

Ich möchte, dass R mehrere xlsx-Dateien mit mehreren Blättern lesen. Alle Blätter und Dateien haben die gleichen Spalten, aber nicht die gleiche Länge und NAs sollten ausgeschlossen werden. Ich möchte die ersten drei Zeilen überspringen und nehmen nur in den Spalten 1: 6, 08.10, 12.17, 19.

Bisher habe ich versucht:

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) 

Aber dies geschieht nur alle ersten Blatt jeder Datei

Weiß jemand, wie man alle Blätter und Akten in einem R Datenrahmen zusammenbringt?

Welche Pakete würden Sie auch für große Datenmengen empfehlen? Bisher habe ich readxl und XLConnect ausprobiert.

Danke eine Million!

+1

Sie haben nur das erste Blatt in Ihrer Funktion explizit gefragt: x = read.xlsx (i, * sheetIndex = 1 *, ....) – mkt

+1

Auch Wenn Sie die Geschwindigkeit für große Datasets optimieren möchten, sollten Sie das Paket data.table nachschlagen. Mit der fread-Funktion können Sie unter anderem nur die benötigten Spalten einlesen, anstatt alle Spalten zu lesen und dann zu unterteilen. Aber ich bin mir nicht sicher, dass es mit .xlsx-Dateien funktioniert. – mkt

+0

Ihr Gerät hat Dateien überschliffen, Sie müssen eine zweite Schleife über die Blätter legen, um zu bekommen, was Sie wollen. – Choubi

Antwort

2

Ich würde eine verschachtelte Schleife wie diese verwenden, um jedes Blatt jeder Datei zu durchlaufen. Es ist vielleicht nicht die schnellste Lösung, aber es ist die einfachste.

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 

    } 
} 

Sie können NA Werte nach der Ladephase reinigen.

+0

Vielen Dank! Es klappt bei mir noch nicht gut. Ich erhalte eine Warnung: Fehler in charToDate (x): Zeichenkette ist nicht in einem standardmäßigen eindeutigen Format – Elisah

+0

Das klingt wie ein Fehler, den Sie erhalten würden, nachdem Sie alles geladen haben, wenn Sie Ihre Datumsvariable formatieren. Bei diesem Fehler müssen Sie normalerweise Ihre Datumsvariable manipulieren, um sie in ein Standardformat zu bringen. Siehe [diesen Beitrag] (http://stackoverflow.com/questions/14755425/what-are-the-standard-unambiguous-date-formats). – GPierre

+0

Es könnte auch von R kommen, die versucht, die Klasse Ihrer Spalten zu erraten und fälschlicherweise davon auszugehen, dass es sich um ein Datum handelt (siehe '? Read.xlsx'). In diesem Fall würde ich vorschlagen, das Argument 'colClasses' zu verwenden, um zu erzwingen, dass alle Spalten als Strings geladen werden. Und bereinigen Sie die Daten, nachdem alles geladen ist (geben Sie korrekte Klassen, NA ..). – GPierre

3

openxlsx Lösung:

filename <-"myFilePath" 

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

Ich denke, das ist eine schnellere und elegantere Lösung !! Vielen Dank! – SeanM