2017-06-14 102 views
5

這是this one的後續問題。將.xlsx文件讀入R的最快方法是什麼?快速讀/寫xlsx文件到/從R

我用library(xlsx)來讀取36 .xlsx文件中的數據。有用。但是,問題在於這非常耗時(超過30分鐘),尤其是考慮到每個文件中的數據不是那麼大(每個文件中的大小爲3 * 3652的矩陣)。爲此,請問有沒有更好的辦法來解決這個問題?有沒有另一種快速讀取.xlsx到R的方法?或者我可以將36個文件快速放入一個csv文件,然後讀入R?

此外,我剛剛意識到readxl不能寫xlsx。有沒有與它對應的書面處理而不是閱讀?

「針對這些投這個問題倒」:

這個問題是關於事實而不是所謂的「自以爲是的答案和垃圾郵件」,因爲速度是時間,時間是一個事實,但不是意見。

進一步更新:

或許可以用通俗易懂的語言向我們解釋爲什麼一些方法的工作比別人快很多。我當然對此感到困惑。

+6

使用'readxl :: read_excel()',它通常是更快 – scoa

+3

可嘗試在'openxlsx'或'readxl'package。 – Jaap

+3

這是一個完全合理的問題,就像我們在SO中看到其他問題一樣,在R中讀取或寫入'.csv'文件的最快方法是什麼。問題的答案需要一個基準,它可能是有趣的吸引大量觀衆 –

回答

1

這是一個小的基準測試。結果:使用標準設置,平均約readxl::read_xlsx跨越不同行數(n)和列(p)的openxlsx::read.xlsx兩倍。

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")