Menu

R で Excel ファイルを読み込む(readxl)

R は単独では .xlsx ファイルを開けません — その隙間を埋めるのが readxl パッケージです。シートや範囲、ヘッダーの読み込み方、Excel への書き出し、そして典型的な Excel インポートの罠の避け方。

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 パッケージを使いましょう。プログラムからスタイル付きのブックを構築できます。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める