2016-04-07 7 views
2

ich in Excel-Dateien in R lese mit dem readxl Paket wie folgt aus:begrenzte Anzahl von Zeilen aus Excel-Datei in R mit read_excel Lesen

library(readxl) 
file_names <- list.files(pattern = ".xlsx") 

list_collection <- list() 
for(i in 1:length(file_names)){ 
    frame <- read_excel(file_names[i],) 
    frame_sub <- frame[1:100,] 
    list_collection[i] <- list(frame_sub) 
} 

Da gibt es eine Menge von Excel-Dateien, und ich möchte nur die ersten 100 Zeilen. Offensichtlich ist das nicht effizient. Gibt es eine Möglichkeit, anfangs nur 100 Zeilen von Excel zu lesen, anstatt diese ganze Datei zu lesen und DANN Subsetting?

+0

dies mit einiger Ausführlichkeit auf der [readxl Problemliste diskutiert worden ... ] (https://github.com/hadley/readxl/issues/8) weiß nicht, wann es das Tageslicht sehen wird –

Antwort

3

Versuchen Sie stattdessen xlsx::read.xlsx(). Es hat Argumente für die Angabe der Start- und Endzeilen. Beachten Sie auch, dass ich einige Verbesserungen an Ihrer for()-Schleife vorgenommen habe (Speicherzuweisung ist die wichtigste).

library(xlsx) 
## get file names 
file_names <- list.files(pattern = "\\.xlsx$") 
## allocate memory for our list 
out <- vector("list", length(file_names)) 
## read the files and assign them to the list 
for(i in seq_along(file_names)) { 
    out[[i]] <- read.xlsx(file_names[i], startRow = 1, endRow = 100) 
} 

Oder Sie könnten durch eine Änderung der for() Schleife

for(file in file_names) { 
    out[[file]] <- read.xlsx(file, startRow = 1, endRow = 100) 
} 
0

kamen in diesem während der Suche nach der gleichen Sache eine benannte Liste zu tun - dies hat auf die neuesten readxl Updates hinzugefügt. Um die ersten 100 Zeilen in Ihrem Blatt könnten Sie tun

library(readxl) 
file_names <- list.files(pattern = ".xlsx") 

list_collection <- list() 
for(i in 1:length(file_names)){ 
    frame <- read_excel(file_names[i], n_max = 100) 
    list_collection[i] <- list(frame) 
} 

Oder könnten Sie bestimmte Zeilen angeben etwas mit wie

frame <- read_excel(file_names[i], range = cell_rows(1:100))