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?
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")
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')
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.
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
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)
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
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)})
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
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
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".
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")