Подтвердить что ты не робот

Быстрый способ чтения файлов xlsx в R

Это следующий вопрос этого. Каков самый быстрый способ чтения файлов .xlsx в R?

Я использую library(xlsx) для чтения из 36 файлов .xlsx. Оно работает. Однако проблема заключается в том, что это очень трудоемкий процесс (более 30 минут), особенно если рассматривать данные в каждом файле не так много (матрица размером 3 * 3652 в каждом файле). С этой целью лучше справиться с такой проблемой, пожалуйста? Есть ли еще один быстрый способ прочитать .xlsx в R? Или я могу быстро поместить 36 файлов в один файл csv, а затем читать в R?

Кроме того, я просто понял, что readxl не может писать xlsx. Есть ли его копия для написания вместо чтения?

"Ответ на тех, кто проголосовал за этот вопрос":

Этот вопрос касается факта, а не так называемых "самоуверенных ответов и спама", поскольку скорость - это время и время, но факт НЕ.

Дальнейшее обновление:

Возможно, можно объяснить нам простым языком, почему какой-то метод работает намного быстрее, чем другие. Я, конечно, смущен этим.

4b9b3361

Ответ 1

Вот небольшой тест. Результаты: readxl::read_xlsx в среднем примерно в два раза быстрее, чем openxlsx::read.xlsx в различном количестве строк (n) и столбцов (p) с использованием стандартных настроек.

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