快速读取/写入xlsx文件的方法

时间:2017-06-14 07:27:18

标签: r xlsx

这是this one的后续问题。将$scope.treeOptions = { beforeDrop : function (e) { return confirm("Are you sure?"); } }; 个文件读入R的最快方法是什么?

我使用.xlsx从36个library(xlsx)文件中读取数据。有用。然而,问题在于这非常耗时(超过30分钟),尤其是在考虑每个文件中的数据不是那么大时(每个文件中的矩阵大小为3 * 3652)。为此,请问有更好的处理这样的问题吗?还有另一种快速方法可以将.xlsx读入R吗?或者我可以快速将36个文件放入单个csv文件中,然后读入R?

此外,我刚才意识到.xlsx无法编写xlsx。是否有对应的处理写作而不是阅读?

"对这些问题的回复#34;

这个问题是关于事实,而不是所谓的“见解答案和垃圾邮件”#34;因为速度是时间和事实,但 意见。

进一步更新:

也许有人可以用简单的语言向我们解释为什么某些方法的工作速度比其他方法快得多。我当然对此感到困惑。

2 个答案:

答案 0 :(得分:11)

这是一个小型基准测试。结果:使用标准设置,不同行数(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")

答案 1 :(得分:2)

要编写一个excel文件,readxl有一个名为writexl的副本。至于什么是读取excel文件的最佳软件包,我认为上面提供的基准相当不错。

我要使用xlsx编写程序包的唯一原因是,如果我要在一个.xlsx文件中编写许多excel表。