R が Excel ファイルを読むにはパッケージが必要
base R はプレーンテキスト形式をそのまま読めますが、.xlsx はテキストではありません — XML を ZIP でまとめた束であり、その前身の .xls はバイナリ形式でした。あなたを待っている組み込みの read.xlsx() は存在しません。Excel ファイルを開くにはパッケージをインストールします。標準的な選択は readxl です。.xlsx と .xls の両方を読み、外部依存がなく(Java も Excel のインストールも不要)、1 つの仕事をうまくこなします。
install.packages("readxl") # once per machine
library(readxl) # once per session
このページのスニペットはローカルに readxl がインストールされている必要があるため、実行可能なブロックではなく静的なコードとして示しています — ご自身の R セッションで実行してください。パッケージ が初めてなら、要約はこうです。install.packages() が一度だけダウンロードし、library() が R を起動するたびに読み込みます。
read_excel(): 基本
1 回の呼び出しで、ブックの最初のシートを R に読み込みます。
library(readxl)
sales <- read_excel("sales.xlsx")
head(sales)
str(sales)
どんなインポートでも習慣は同じです。str() で各列の型を確認し、head() で先頭の行を目視します。ファイルが見つからない場合、原因はほぼ必ず作業ディレクトリです — file.exists("sales.xlsx") が 1 秒で教えてくれ、直し方は CSV ファイル と同じです。フルパスを使うか、作業ディレクトリをファイルのフォルダに設定します。
返ってくるのは tibble — データフレームに対する tidyverse の解釈です。初心者が行うことのすべてにおいて、これはデータフレームとまったく同じように振る舞います(実際にデータフレーム である うえに、おまけが付いています)。$ で列を取り出せ、nrow() で行を数えられ、dplyr の動詞にそのまま流れます。目に見える違いは見た目に関するもので、快適です。すべてを吐き出す代わりに、最初の 10 行だけを名前の下に列の型を添えて表示します。古い関数が素のデータフレームでなければ受け付けない場合は、as.data.frame(sales) で変換できます。
シート・範囲の選択とゴミの読み飛ばし
実際のブックが、セル A1 から始まるきれいな 1 つの表であることはめったにありません。readxl の引数はよくある混乱に対処します。
どのシートがあるか? 読む前に尋ねましょう。
excel_sheets("report.xlsx")
# [1] "Summary" "Q1" "Q2" "Q3" "Raw data"
sheet = は名前または位置で 1 つを選びます。
q3 <- read_excel("report.xlsx", sheet = "Q3")
raw <- read_excel("report.xlsx", sheet = 5)
名前の方を選びましょう — sheet = 5 は誰かがタブを並べ替えた日に、黙って間違ったシートを読みます。
range = は Excel 自身の記法で、正確な長方形を読みます。ロゴの行、タイトル行、実際の表の周りの余計な注記を飛ばす最もきれいな方法です。
budget <- read_excel("budget.xlsx", range = "B4:E20")
budget <- read_excel("budget.xlsx", sheet = "Plan", range = "B4:E20")
skip = と col_names = は、データの上に何行のゴミがあるかは分かっていても、どこで終わるかは分からない場合の、もっと緩い代替手段です。
# Data starts after 3 title rows, first real row is the header:
df <- read_excel("export.xlsx", skip = 3)
# No header row at all - supply names yourself:
df <- read_excel("export.xlsx", col_names = c("id", "region", "amount"))
col_names = TRUE(既定)は最初の行を名前として使い、FALSE は ...1, ...2 を生成して 1 行目をデータとして扱います。
Excel への書き出しには別のパッケージが必要
readxl は設計上、読み込み専用です。同僚が結果を スプレッドシートとして 欲しがるとき、最短の道は writexl です — 依存関係のない 1 行です。
install.packages("writexl")
writexl::write_xlsx(results, "results.xlsx")
生の値以上のものが必要な場合 — 太字のヘッダー、ウィンドウ枠の固定、セルの色、1 つのブックの中の複数の書式付きシート — は openxlsx の領分です。
library(openxlsx)
write.xlsx(list(Summary = summary_df, Detail = detail_df), "report.xlsx")
名前付きリストは、要素ごとに 1 シートになります。openxlsx は Excel ファイルの読み込みもできるので、実際には両方向で使われているのを見かけます。単に読むだけなら、readxl の方が引き続き単純な道具です。
現実的な代替案: CSV としてエクスポートする
ときには最も工夫のない解決策が勝ちます。ブックが 1 回限りのもの — 誰かがスプレッドシートをメールで送ってきて、今すぐ 数値が必要 — なら、Excel で開き、「名前を付けて保存」でシートを CSV としてエクスポートし、すでに知っている道具で読みましょう。
df <- read.csv("sales.csv")
パッケージも、シート名も、結合セルもありません。全体の流れは CSV の読み込み にあります。トレードオフはこうです。他のシートは失われ、書式に基づく情報(何かを「意味する」セルの色 — そもそもデータ設計としては臭いますが)は平坦になり、エクスポートは手作業の手順なので、元ファイルが更新されたときに誰かが忘れます。繰り返すパイプラインなら .xlsx を直接読み、1 回限りのインポートなら CSV で正直に十分です。
典型的な Excel インポートの罠
Excel ファイルは CSV にはない問題を抱えています。スプレッドシートは、表がすべきでないことを人間にさせてくれるからです。
日付が数値として届く。 Excel は日付を通算日数として格納するので、列が型を混在させていたり奇妙な書式が設定されていたりすると、日付を期待した場所に 44688 が現れることがあります。readxl は通常、本物の日付セルを正しく変換しますが、生の数値を受け取ってしまったときは Excel の起点で変換します — それは 1970 年ではなく 1899-12-30 です。
as.Date(44688, origin = "1899-12-30")
# [1] "2022-05-07"
結合セルは空白に分解される。 3 列にまたがって結合されたヘッダーは、1 つの値と 2 つの空セルとして返ります。10 行にわたって結合されたカテゴリのラベルは、1 つの値と 9 つの欠損になります。readxl は視覚的にしか存在しなかった意図を復元できません — インポート後にその隙間を自分で埋めることを覚悟しましょう。
紛れ込んだ 1 セルが列をテキストに変える。 列の型はデータから推測されるので、たった 1 つの "n/a"、数値の中に打ち込まれたメモ、「空」セルの中の空白 1 つで、列全体が文字列として返ってきます。読み込んだ直後の str() がこれを捕まえます。推測がどうしても外れ続けるときは、col_types 引数(例: col_types = c("text", "numeric", "date"))で強制します。
通底するテーマはこうです。スプレッドシートは表ではなく、人が絵を描くキャンバスです。疑いの帽子をかぶって読み、str() を実行し、インポートを信用する前にいくつかの値を元ファイルと照合しましょう。
この記事のまとめ
- base R は
.xlsxを読めません — readxl をインストールしてread_excel("file.xlsx")を使いましょう。 excel_sheets()はブックの中身を列挙し、sheet =(名前を優先)が 1 つを選び、range = "B4:E20"が欲しい表を正確に切り出します。- 返ってくるのは tibble です — 表示がより快適なデータフレームです。
- 書き出しは別のパッケージを通ります: 素の出力には
writexl::write_xlsx()、書式付きのブックには openxlsx。 - 1 回限りの用途なら、Excel から CSV をエクスポートして
read.csv()を使うのも十分立派な近道です。 - 典型的な 3 つに注意しましょう: 通算数値としての日付(起点は
1899-12-30)、空白になる結合セル、そして列をテキストに引きずり込む 1 つの悪いセル。
次は 逆方向 — データフレームを CSV や RDS ファイルに書き出す方法です。
よくある質問
R で Excel ファイルを読み込むにはどうすればよいですか?
install.packages("readxl") で readxl パッケージを一度インストールし、library(readxl) で読み込み、read_excel("file.xlsx") を呼び出します。最初のシートから作られた tibble(現代的なデータフレーム)を返します。別のシートを名前または位置で読むには sheet = 引数を使います。
R はパッケージなしで Excel ファイルを読めますか?
いいえ。base R には .xlsx や .xls のリーダーがありません — これらはテキストではなくバイナリ / ZIP 形式です。パッケージを使う(readxl が標準で、openxlsx でも可能です)か、Excel からシートを CSV としてエクスポートしてパッケージ不要の read.csv() を使うかのどちらかです。
R で Excel ファイルの特定のシートを読み込むにはどうすればよいですか?
read_excel に sheet = を渡します: 名前で指定するなら read_excel("report.xlsx", sheet = "Q3")、位置で指定するなら sheet = 3 です。ブックに何が入っているか分からない場合、excel_sheets("report.xlsx") がすべてのシート名を文字列ベクトルで返します。
R から Excel ファイルを書き出すにはどうすればよいですか?
readxl は読み込み専用です。書き出しの 1 行は writexl::write_xlsx(df, "out.xlsx") です。書式が必要な場合 — 色、列幅、スタイル付きの複数シート — は代わりに openxlsx パッケージを使いましょう。プログラムからスタイル付きのブックを構築できます。