web-dev-qa-db-ja.com

Excelブック内のすべてのワークシートを、data.framesを含むRリストに読み取ります。

XLConnectを使用してExcelワークシートをRに読み込むことができることを理解しています。たとえば、これはtest.xlsというワークブックの最初のワークシートをRに読み込みます。

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

複数のワークシートを持つExcelワークブックがあります。

リストの各要素が特定のシートのdata.frameであり、各要素の名前がExcelのワークシートの名前に対応する場合、ワークブック内のすべてのワークシートをRのリストにインポートするにはどうすればよいですか?

59
Jeromy Anglim

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
}

これは次の方法で呼び出すことができます。

mysheets <- read_Excel_allsheets("foo.xls")

古い答え

@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)})
}

したがって、次のように呼び出すことができます。

importWorksheets('test.xls')
86
Jeromy Anglim

XLConnectのほとんどの関数は既にベクトル化されていることに注意してください。つまり、明示的なベクトル化を行わなくても、1回の関数呼び出しですべてのワークシートを読み取ることができます。

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

XLConnect 0.2-0では、lstはすでに名前付きリストになります。

41
Martin Studer

公式readxl(整頓)ドキュメント(最初の行を変更)から:

path <- "data/datasets.xlsx"

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

詳細: http://readxl.tidyverse.org/articles/articles/readxl-workflows.html#iterate-over-multiple-worksheets-in-a-workbook

13
Paul

私はこの古い質問に出くわしましたが、最も簡単なアプローチはまだありません。

rioを使用して、1行のコードですべてのExcelシートをインポートできます。

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

tidyverseが好きな人は、setclass引数を関数呼び出しに追加することで、簡単にティブルとしてインポートできます。

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

それらが同じ形式であると仮定すると、rbind引数をTRUEに設定することで簡単に行バインドできます。

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

これが質問に対する一番のヒットであるため:リストに複数シートのExcelを読む:

openxlsxソリューションは次のとおりです。

filename <-"myFilePath"

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

ワークブックをロードし、lapplygetSheets、および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)})
7
mnel

Excel.link は仕事をします。

実際、XLConnectと比較して使いやすいことがわかりました(どちらのパッケージも使いにくいというわけではありません)。両方の学習曲線は約5分でした。

余談ですが、 http://cran.r-project.org/web/packages/available_packages_by_name.html を参照すると、Wordの「Excel」に言及しているすべてのRパッケージを簡単に見つけることができます。

3
Contango

上記を試してみましたが、変換に必要な20 MBのExcelのデータ量に問題がありました。したがって、上記は私にとってはうまくいきませんでした。

さらに調査した後、私はopenxlsxにつまずき、これがついに(そして高速に)トリックを行いました Rへの大きなxlsxファイルのインポート?

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

1
windyvation

ブックから複数のシートを読み取るには、次のようにreadxlパッケージを使用します。

library(readxl)
library(dplyr)

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

ここでは、bind_row(dplyr)はすべてのシートのすべてのデータ行を1つのデータフレームに配置し、path_to_workbookは "dir/of/the/data/workbook"です。

1
TheMI

ポールの答えに追加します。シートは、次のようなものを使用して連結することもできます。

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

必要なライブラリ:

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