2017-06-14 13 views
5

Jest to kolejne pytanie do this one. Jaki jest najszybszy sposób na odczytanie plików .xlsx na R?Szybki sposób na odczytywanie/zapisywanie plików xlsx do/z R

Używam library(xlsx) do odczytu danych z 36 .xlsx plików. To działa. Problem polega jednak na tym, że jest to bardzo czasochłonne (trwające ponad 30 minut), szczególnie biorąc pod uwagę, że dane w każdym pliku nie są zbyt duże (macierz o rozmiarze 3 * 3652 w każdym pliku). W tym celu, czy jest lepiej poradzić sobie z takim problemem? Czy istnieje inny szybki sposób na odczytanie .xlsx na R? Czy mogę szybko umieścić 36 plików w jednym pliku CSV, a następnie wczytać do R?

Ponadto, właśnie zdałem sobie sprawę, że readxl nie można napisać xlsx. Czy istnieje odpowiednik tego, by radzić sobie z pisaniem zamiast czytania?

„Reakcja na te głosował na to pytanie w dół”:

to pytanie jest o rzeczywistości zamiast tzw „uparty odpowiedzi i spam”, ponieważ prędkość jest czas, a czas jest fakt, ale NOT Opinia.

Dalsza zmiana:

Może ktoś wyjaśnić nam, prostym językiem, dlaczego niektórzy metoda działa znacznie szybciej niż inni. Jestem z tym zdezorientowany.

+6

użycie 'readxl :: read_excel()', to zwykle szybciej – scoa

+3

Albo spróbuj 'openxlsx' lub' readxl'package. – Jaap

+3

To jest całkowicie uzasadnione pytanie, tak jak widzieliśmy inne pytania w SO na temat tego, co jest najszybszym sposobem na odczytanie lub zapisanie plików '.csv' w R. Odpowiedź na pytania wymagałaby testu porównawczego i mogłaby być interesująca dla dużej publiczności –

Odpowiedz

1

Oto mały test porównawczy. Wyniki: readxl::read_xlsx średnio około dwa razy szybciej niż openxlsx::read.xlsx w różnych rzędach (n) i kolumnach (p) przy użyciu ustawień standardowych.

enter image description here

options(scipen=999) # no scientific number format 

nn <- c(1, 10, 100, 1000, 5000, 10000, 20000, 30000) 
pp <- c(1, 5, 10, 20, 30, 40, 50) 

# create some excel files 
l <- list() # save results 
tmp_dir <- tempdir() 

for (n in nn) { 
    for (p in pp) { 
    name <- 
    cat("\n\tn:", n, "p:", p) 
    flush.console() 
    m <- matrix(rnorm(n*p), n, p) 
    file <- paste0(tmp_dir, "/n", n, "_p", p, ".xlsx") 

    # write 
    write.xlsx(m, file) 

    # read 
    elapsed <- system.time(x <- openxlsx::read.xlsx(file))["elapsed"] 
    df <- data.frame(fun = "openxlsx::read.xlsx", n = n, p = p, 
        elapsed = elapsed, stringsAsFactors = F, row.names = NULL) 
    l <- append(l, list(df)) 

    elapsed <- system.time(x <- readxl::read_xlsx(file))["elapsed"] 
    df <- data.frame(fun = "readxl::read_xlsx", n = n, p = p, 
        elapsed = elapsed, stringsAsFactors = F, row.names = NULL) 
    l <- append(l, list(df)) 

    } 
} 

# results 
d <- do.call(rbind, l) 

library(ggplot2) 

ggplot(d, aes(n, elapsed, color= fun)) + 
    geom_line() + geom_point() + 
    facet_wrap(~ paste("columns:", p)) + 
    xlab("Number of rows") + 
    ylab("Seconds") 
Powiązane problemy