XLConnect
を使用してExcelワークシートをRに読み込むことができることを理解しています。たとえば、これはtest.xls
というワークブックの最初のワークシートをRに読み込みます。
library(XLConnect)
readWorksheetFromFile('test.xls', sheet = 1)
複数のワークシートを持つExcelワークブックがあります。
リストの各要素が特定のシートのdata.frameであり、各要素の名前がExcelのワークシートの名前に対応する場合、ワークブック内のすべてのワークシートをRのリストにインポートするにはどうすればよいですか?
この質問を投稿してから、readxl
パッケージがリリースされました。 xls
とxlsx
の両方の形式をサポートしています。重要なのは、他の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')
XLConnectのほとんどの関数は既にベクトル化されていることに注意してください。つまり、明示的なベクトル化を行わなくても、1回の関数呼び出しですべてのワークシートを読み取ることができます。
require(XLConnect)
wb <- loadWorkbook(system.file("demoFiles/mtcars.xlsx", package = "XLConnect"))
lst = readWorksheet(wb, sheet = getSheets(wb))
XLConnect 0.2-0では、lstはすでに名前付きリストになります。
公式readxl
(整頓)ドキュメント(最初の行を変更)から:
path <- "data/datasets.xlsx"
path %>%
Excel_sheets() %>%
set_names() %>%
map(read_Excel, path = path)
私はこの古い質問に出くわしましたが、最も簡単なアプローチはまだありません。
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)
これが質問に対する一番のヒットであるため:リストに複数シートのExcelを読む:
openxlsx
ソリューションは次のとおりです。
filename <-"myFilePath"
sheets <- openxlsx::getSheetNames(filename)
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename)
names(SheetList) <- sheets
ワークブックをロードし、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)})
Excel.link は仕事をします。
実際、XLConnectと比較して使いやすいことがわかりました(どちらのパッケージも使いにくいというわけではありません)。両方の学習曲線は約5分でした。
余談ですが、 http://cran.r-project.org/web/packages/available_packages_by_name.html を参照すると、Wordの「Excel」に言及しているすべてのRパッケージを簡単に見つけることができます。
上記を試してみましたが、変換に必要な20 MBのExcelのデータ量に問題がありました。したがって、上記は私にとってはうまくいきませんでした。
さらに調査した後、私はopenxlsxにつまずき、これがついに(そして高速に)トリックを行いました Rへの大きなxlsxファイルのインポート?
https://cran.r-project.org/web/packages/openxlsx/openxlsx.pdf
ブックから複数のシートを読み取るには、次のように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"です。
ポールの答えに追加します。シートは、次のようなものを使用して連結することもできます。
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")