将 xlsx 文件读入 R 的快速方法
Fast way to read xlsx files into R
这是 this one 的后续问题。将 .xlsx
文件读入 R 的最快方法是什么?
我使用 library(xlsx)
从 36 .xlsx
个文件中读取数据。有用。然而,问题是这非常耗时(超过 30 分钟),尤其是考虑到每个文件中的数据不是那么大(每个文件中大小为 3*3652 的矩阵)时。为此,请问有更好的方法来处理这样的问题吗?还有另一种快速方法可以将 .xlsx
读入 R 吗?或者我可以将 36 个文件快速放入一个 csv 文件,然后读入 R 吗?
另外,我才发现readxl
不能写xlsx。有没有对应的处理写而不是读的?
"Response to those voted this question down":
这个问题是关于事实而不是所谓的"opinionated answers and spam"因为速度就是时间,时间就是事实但是NOT意见
进一步更新:
也许有人可以用通俗易懂的语言向我们解释为什么某些方法比其他方法工作得更快。我当然对此感到困惑。
这里是一个小的基准测试。结果:使用标准设置,readxl::read_xlsx
在不同行数 (n
) 和列数 (p
) 上的平均速度是 openxlsx::read.xlsx
的两倍。
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")
要写一个 excel 文件,readxl
有一个名为 writexl
的对应文件。至于读取 excel 文件的最佳包是什么,我认为上面提供的基准非常好。
我使用 xlsx
编写程序包的唯一原因是如果我要在一个 .xlsx
文件中编写许多 excel 页。
这是 this one 的后续问题。将 .xlsx
文件读入 R 的最快方法是什么?
我使用 library(xlsx)
从 36 .xlsx
个文件中读取数据。有用。然而,问题是这非常耗时(超过 30 分钟),尤其是考虑到每个文件中的数据不是那么大(每个文件中大小为 3*3652 的矩阵)时。为此,请问有更好的方法来处理这样的问题吗?还有另一种快速方法可以将 .xlsx
读入 R 吗?或者我可以将 36 个文件快速放入一个 csv 文件,然后读入 R 吗?
另外,我才发现readxl
不能写xlsx。有没有对应的处理写而不是读的?
"Response to those voted this question down":
这个问题是关于事实而不是所谓的"opinionated answers and spam"因为速度就是时间,时间就是事实但是NOT意见
进一步更新:
也许有人可以用通俗易懂的语言向我们解释为什么某些方法比其他方法工作得更快。我当然对此感到困惑。
这里是一个小的基准测试。结果:使用标准设置,readxl::read_xlsx
在不同行数 (n
) 和列数 (p
) 上的平均速度是 openxlsx::read.xlsx
的两倍。
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")
要写一个 excel 文件,readxl
有一个名为 writexl
的对应文件。至于读取 excel 文件的最佳包是什么,我认为上面提供的基准非常好。
我使用 xlsx
编写程序包的唯一原因是如果我要在一个 .xlsx
文件中编写许多 excel 页。