web-dev-qa-db-fra.com

Lire toutes les feuilles de calcul d'un classeur Excel dans une liste R avec data.frames

Je comprends que XLConnect peut être utilisé pour lire une feuille de calcul Excel dans R. Par exemple, ceci lirait la première feuille de calcul d’un classeur appelé test.xls en R.

library(XLConnect)
readWorksheetFromFile('test.xls', sheet = 1)

J'ai un classeur Excel avec plusieurs feuilles de calcul.

Comment importer toutes les feuilles de calcul d'un classeur dans une liste R où chaque élément de la liste est un nom data.frame pour une feuille donnée et où le nom de chaque élément correspond au nom de la feuille de calcul Excel?

59
Jeromy Anglim

Réponse mise à jour à l'aide de readxl (22 juin 2015)

Depuis la publication de cette question, le package readxl a été publié. Il prend en charge les formats xls et xlsx. Il est important de noter que, contrairement aux autres packages d'importation Excel, il fonctionne sous Windows, Mac et Linux sans nécessiter l'installation de logiciels supplémentaires.

Ainsi, une fonction permettant d'importer toutes les feuilles d'un classeur Excel serait:

library(readxl)    
read_Excel_allsheets <- function(filename, tibble = FALSE) {
    # I prefer straight data.frames
    # but if you like tidyverse tibbles (the default with read_Excel)
    # then just pass tibble = TRUE
    sheets <- readxl::Excel_sheets(filename)
    x <- lapply(sheets, function(X) readxl::read_Excel(filename, sheet = X))
    if(!tibble) x <- lapply(x, as.data.frame)
    names(x) <- sheets
    x
}

Cela pourrait être appelé avec:

mysheets <- read_Excel_allsheets("foo.xls")

Ancienne réponse

Sur la base de la réponse fournie par @mnel, voici une fonction simple qui prend un fichier Excel en tant qu’argument et renvoie chaque feuille sous la forme d’un nom data.frame dans une liste nommée.

library(XLConnect)

importWorksheets <- function(filename) {
    # filename: name of Excel file
    workbook <- loadWorkbook(filename)
    sheet_names <- getSheets(workbook)
    names(sheet_names) <- sheet_names
    sheet_list <- lapply(sheet_names, function(.sheet){
        readWorksheet(object=workbook, .sheet)})
}

Ainsi, il pourrait être appelé avec:

importWorksheets('test.xls')
86
Jeromy Anglim

Notez que la plupart des fonctions de XLConnect sont déjà vectorisées. Cela signifie que vous pouvez lire toutes les feuilles de calcul avec un seul appel de fonction sans avoir à effectuer de vectorisation explicite:

require(XLConnect)
wb <- loadWorkbook(system.file("demoFiles/mtcars.xlsx", package = "XLConnect"))
lst = readWorksheet(wb, sheet = getSheets(wb))

Avec XLConnect 0.2-0 lst sera déjà une liste nommée.

41
Martin Studer

De la documentation officielle readxl (tidyverse) (en changeant la première ligne):

path <- "data/datasets.xlsx"

path %>% 
  Excel_sheets() %>% 
  set_names() %>% 
  map(read_Excel, path = path)

Détails sur: http://readxl.tidyverse.org/articles/articles/readxl-workflows.html#iterate-over-multiple-worksheets-in-a-workbook

13
Paul

Je suis tombé sur cette vieille question et je pense que l’approche la plus simple manque encore.

Vous pouvez utiliser rio pour importer toutes les feuilles Excel avec une seule ligne de code.

library(rio)
data_list <- import_list("test.xls")

Si vous êtes fan de tidyverse, vous pouvez facilement les importer sous forme de mots-clés en ajoutant l'argument setclass à l'appel de fonction.

data_list <- import_list("test.xls", setclass = "tbl")

Supposons qu’ils aient le même format, vous pouvez facilement les lier en plaçant l’argument rbind sur TRUE.

data_list <- import_list("test.xls", setclass = "tbl", rbind = TRUE)
11
j3ypi

Comme il s’agit là du succès numéro un de la question: lisez Excel multi-feuilles pour lister:

voici la solution openxlsx:

filename <-"myFilePath"

sheets <- openxlsx::getSheetNames(filename)
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename)
names(SheetList) <- sheets
9
Andre Elrico

Vous pouvez charger le cahier de travail, puis utiliser lapply, getSheets et readWorksheet et procéder de la sorte.

wb.mtcars <- loadWorkbook(system.file("demoFiles/mtcars.xlsx", 
                          package = "XLConnect"))
sheet_names <- getSheets(wb.mtcars)
names(sheet_names) <- sheet_names

sheet_list <- lapply(sheet_names, function(.sheet){
    readWorksheet(object=wb.mtcars, .sheet)})
7
mnel

Excel.link fera le travail.

En fait, je l’ai trouvé plus facile à utiliser par rapport à XLConnect (aucun de ces paquets n’est aussi difficile à utiliser). La courbe d'apprentissage pour les deux était d'environ 5 minutes.

En passant, vous pouvez facilement trouver tous les paquets R qui mentionnent le mot "Excel" en naviguant sur http://cran.r-project.org/web/packages/available_packages_by_name.html

3
Contango

J’ai essayé ce qui précède et j’ai eu des problèmes avec la quantité de données que mon compte Excel de 20 Mo devait convertir; donc ce qui précède n'a pas fonctionné pour moi.

Après plus de recherches je suis tombé sur openxlsx et celui-ci a finalement fait le tour (et vite) Importer un gros fichier xlsx dans R?

https://cran.r-project.org/web/packages/openxlsx/openxlsx.pdf

1
windyvation

Pour lire plusieurs feuilles d'un classeur, utilisez le package readxl comme suit:

library(readxl)
library(dplyr)

final_dataFrame <- bind_row(path_to_workbook %>%
                              Excel_sheets() %>%
                              set_names() %>%
                              map(read_Excel, path = path_to_workbook))

Ici, bind_row (dplyr) mettra toutes les lignes de données de toutes les feuilles dans un seul cadre de données et path_to_workbook sera "dir/of/the/data/workbook".

1
TheMI

Ajoutant à la réponse de Paul. Les feuilles peuvent également être concaténées en utilisant quelque chose comme ceci:

data = path %>% 
Excel_sheets() %>% 
set_names() %>% 
map_df(~ read_Excel(path = path, sheet = .x), .id = "Sheet")

Bibliothèques nécessaires:

if(!require(pacman))install.packages("pacman")
pacman::p_load("tidyverse","readxl","purrr")
0
Nikhil Gupta