web-dev-qa-db-ja.com

xlsxファイルをRに読み込む高速な方法

これ へのフォローアップの質問です。 _.xlsx_ファイルをRに読み込む最も速い方法は何ですか?

library(xlsx)を使用して、36個の_.xlsx_ファイルからデータを読み取ります。できます。ただし、特に各ファイルのデータがそれほど大きくない場合(各ファイルのサイズ3 * 3652のマトリックス)を考慮すると、これには非常に時間がかかる(30分をはるかに超える)ことが問題です。この目的のために、そのような問題に対処する方が良いですか? _.xlsx_をRに読み込む別の簡単な方法はありますか?または、36個のファイルを単一のcsvファイルにすばやく入れてから、Rに読み込むことはできますか?

さらに、readxlがxlsxを書き込めないことに気づきました。読み取りではなく書き込みを処理する対応するものはありますか?

"この質問に投票した人への回答":

速度は時間であり、時間は事実ですが、[〜#〜]ではないため、この質問は、いわゆる「意見の回答とスパム」ではなく事実についてです[〜#〜] [〜 #〜]意見。

さらに更新:

おそらく、ある方法が他の方法よりもはるかに速く機能する理由をわかりやすい言葉で説明できるでしょう。私は確かにこれについて混乱しています。

14
LaTeXFan

これは小さなベンチマークテストです。結果: readxl::read_xlsxは平均して約2倍の速度で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")
17
Mark Heckmann

Excelファイルを書き込むために、readxlにはwritexlと呼ばれるものがあります。 Excelファイルを読み取るのに最適なパッケージについては、上記のベンチマークはかなり良いと思います。

xlsxを使用してパッケージを作成する唯一の理由は、1つの.xlsxファイルに多数のExcelシートを書き込む場合です。

1
Shawn Brar