web-dev-qa-db-fra.com

Un moyen rapide de lire des fichiers xlsx dans R

C'est une question complémentaire à celle-ci . Quel est le moyen le plus rapide de lire des fichiers .xlsx Dans R?

J'utilise library(xlsx) pour lire les données de 36 fichiers .xlsx. Ça marche. Cependant, le problème est que cela prend beaucoup de temps (bien plus de 30 minutes), surtout si l'on considère que les données de chaque fichier ne sont pas si grandes (matrice de taille 3 * 3652 dans chaque fichier). À cette fin, existe-t-il une meilleure solution pour résoudre ce problème, s'il vous plaît? Existe-t-il un autre moyen rapide de lire .xlsx Dans R? Ou puis-je mettre les 36 fichiers dans un seul fichier csv rapidement puis les lire dans R?

De plus, je viens de réaliser que readxl ne peut pas écrire xlsx. Y a-t-il un équivalent pour gérer l'écriture au lieu de la lecture?

"Réponse à ceux qui ont voté contre cette question":

Cette question porte sur les faits plutôt que sur les soi-disant "réponses d'opinions et spam" car la vitesse est le temps et le temps est un fait mais [~ # ~] pas [~ # ~] opinion.

Nouvelle mise à jour:

On peut peut-être nous expliquer en langage simple pourquoi certaines méthodes fonctionnent beaucoup plus rapidement que d'autres. Je suis certainement confus à ce sujet.

14
LaTeXFan

Voici un petit test de référence. Résultats: readxl::read_xlsx en moyenne environ deux fois plus vite que openxlsx::read.xlsx sur différents nombres de lignes (n) et de colonnes (p) en utilisant les paramètres standard.

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

Pour écrire un fichier Excel, readxl a un équivalent appelé writexl. En ce qui concerne le meilleur package pour lire un fichier Excel, je pense que le benchmark fourni ci-dessus est assez bon.

La seule raison pour laquelle j'utiliserais xlsx pour écrire un package serait si je devais écrire plusieurs feuilles Excel dans une .xlsx fichier.

1
Shawn Brar