将Excel工作簿中的所有工作表读入包含data.frames的R列表

Jer*_*lim 62 excel r xlconnect

据我所知,XLConnect可以用来将Excel工作表读入R.例如,这将读取一个名为test.xlsR 的工作簿中的第一个工作表.

library(XLConnect)
readWorksheetFromFile('test.xls', sheet = 1)
Run Code Online (Sandbox Code Playgroud)

我有一个包含多个工作表的Excel工作簿.

如何将工作簿中的所有工作表导入到R中的列表中,其中列表的每个元素都是给定工作表的data.frame,并且每个元素的名称对应于Excel中工作表的名称?

Jer*_*lim 90

使用readxl更新的答案(2015年6月22日)

自发布此问题以来,该readxl软件包已发布.它支持xlsxlsx格式化.重要的是,与其他excel导入包相比,它适用于Windows,Mac和Linux,无需安装其他软件.

因此,导入Excel工作簿中的所有工作表的功能将是:

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
}
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式调用:

mysheets <- read_excel_allsheets("foo.xls")
Run Code Online (Sandbox Code Playgroud)

老答案

在@mnel提供的答案的基础上,这是一个简单的函数,它将Excel文件作为参数,并将每个工作表作为data.frame返回到命名列表中.

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)})
}
Run Code Online (Sandbox Code Playgroud)

因此,它可以通过以下方式调用:

importWorksheets('test.xls')
Run Code Online (Sandbox Code Playgroud)

  • 非常好,刚刚了解到“readxl”有一个“excel_sheets”方法。精彩的。 (2认同)
  • 似乎这个新答案给了我一个列表中的列表,而不是列表中的数据框。 (2认同)
  • 我正在获取列表而不是数据帧. (2认同)
  • 该函数的一个简单版本是“lapply(excel_sheets(file.path), function(x) read_excel(file.path, x))”。如果您喜欢非 tibble,只需将 read_excel 包装在 `as.data.frame()` 中。之后必须指定名称。 (2认同)

Mar*_*der 41

请注意,大多数XLConnect的函数已经过矢量化.这意味着您可以使用一个函数调用读入所有工作表,而无需进行显式向量化:

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

使用XLConnect 0.2-0 lst将已经是一个命名列表.

  • 对我来说,这工作`require(XLConnect)wb < - loadWorkbook("excel.xlsx")lst = readWorksheet(wb,sheet = getSheets(wb))` (10认同)
  • 我也是.解决方案的答案对我不起作用,即使文件存在也找不到 (3认同)
  • 使用`system.file()`的调用对我来说也不起作用. (2认同)

j3y*_*ypi 15

我偶然发现了这个老问题,我认为最简单的方法仍然缺失.

您只需使用rio一行代码即可导入所有Excel工作表.

library(rio)
data_list <- import_list("test.xls")
Run Code Online (Sandbox Code Playgroud)

如果你是粉丝tidyverse,可以通过setclass在函数调用中添加参数,轻松地将它们作为元素导入.

data_list <- import_list("test.xls", setclass = "tbl")
Run Code Online (Sandbox Code Playgroud)

假设它们具有相同的格式,您可以通过将rbind参数设置为轻松地对它们进行行绑定TRUE.

data_list <- import_list("test.xls", setclass = "tbl", rbind = TRUE)
Run Code Online (Sandbox Code Playgroud)

  • rio :: import_list是一个不错的选择。它也可以导入工作表的一个子集,例如“ import_list(“ test.xls”,= c(1,2))`,这真的很有用。我同意这是这里最简单的选择。 (2认同)

Pau*_*aul 15

从官方readxl(tidyverse)文档(更改第一行):

path <- "data/datasets.xlsx"

path %>% 
  excel_sheets() %>% 
  set_names() %>% 
  map(read_excel, path = path)
Run Code Online (Sandbox Code Playgroud)

详细信息:http: //readxl.tidyverse.org/articles/articles/readxl-workflows.html#iterate-over-multiple-worksheets-in-a-workbook

  • 要保留工作表名称,`df &lt;- path %&gt;% excel_sheets() %&gt;% set_names() %&gt;% map_dfr(read_excel, path = path, .id = "SheetName")` (2认同)

Nik*_*pta 11

添加保罗的答案。这些工作表也可以使用如下方式连接:

data = path %>% 
excel_sheets() %>% 
set_names() %>% 
map_df(~ read_excel(path = path, sheet = .x), .id = "Sheet")
Run Code Online (Sandbox Code Playgroud)

需要的库:

if(!require(pacman))install.packages("pacman")
pacman::p_load("tidyverse","readxl","purrr")
Run Code Online (Sandbox Code Playgroud)

  • 使用工作表名称添加新列的详细信息! (4认同)

And*_*ico 10

由于这是问题的第一位:阅读多表excel列出:

这是openxlsx解决方案:

filename <-"myFilePath"

sheets <- openxlsx::getSheetNames(filename)
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename)
names(SheetList) <- sheets
Run Code Online (Sandbox Code Playgroud)


mne*_*nel 7

您可以加载的工作簿,然后使用lapply,getSheets并且readWorksheet做这样的事情.

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)})
Run Code Online (Sandbox Code Playgroud)


The*_*eMI 6

要从工作簿中读取多个工作表,请使用 readxl 包,如下所示:

library(readxl)
library(dplyr)

final_dataFrame <- bind_rows(path_to_workbook %>%
                              excel_sheets() %>%
                              set_names() %>%
                              map(read_excel, path = path_to_workbook))
Run Code Online (Sandbox Code Playgroud)

这里,bind_rows( dplyr)会将所有工作表中的所有数据行放入一个数据框中,并且path_to_workbook是数据的位置:“dir/of/the/data/workbook”。