Rで解析:外部依存なしでExcelファイルを書き出すwritexlパッケージの紹介
Rで集計した結果を、Excelファイルの形で関係者へ渡す場面は少なくありません。しかし、xlsx形式での書き出しには、JavaランタイムやExcel本体といった外部環境を必要とするパッケージもあり、環境の準備に手間がかかります。「writexl」パッケージは、C言語のライブラリであるlibxlsxwriterを基盤とし、外部の実行環境に依存せずにxlsxファイルを生成します。データフレームをそのままシートへ書き出す機能や、名前付きリストを渡して複数シートのブックを作成する機能が収録されています。また、Excelの数式やハイパーリンクをセルへ埋め込むことも可能です。
パッケージバージョンは2.0.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("writexl")
# パッケージの読み込み
library("writexl")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
架空データを用意し、xlsxファイルへの書き出し、所在地ごとのシート分割、数式とハイパーリンクの埋め込みまでを順に紹介します。
[データフレームをxlsxファイルに書き出す]:write_xlsxコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| x | データフレーム、xl_sheet、xl_workbook、またはそれらの名前付きリストを指定、リストの各要素がシートになる | なし |
| path | 書き出すファイル名を指定 | tempfile(fileext = “.xlsx”) |
| col_names | 列名をシート先頭の見出し行として書き出すか指定 | TRUE |
| format_headers | 見出し行にブックの見出し書式(初期設定は太字・中央寄せ)を適用するか指定 | TRUE |
| na | 値がない場合に書き込む内容を指定、NAはセルを空欄にする | NA |
| use_zip64 | 4GBを超えるxlsxファイルに対応するzip64形式を使用するか指定、環境によっては読み込めない | FALSE |
| constant_memory | 行を逐次書き出してメモリ使用量を抑えるか指定、NAはデータ量に応じて自動で判定する | NA |
| constant_memory_threshold | 逐次書き出しへ切り替える判定に用いるメモリ削減量をバイト単位で指定 | 128 * 1024^2 |
# 直売所の販売実績データを作成
HanbaiData <- data.frame(
直売所名 = c("大通あさいち", "円山ファーム", "白石やさい館", "手稲みのり市", "厚別あおぞら"),
所在地 = c("札幌市中央区", "札幌市中央区", "札幌市白石区", "札幌市手稲区", "札幌市厚別区"),
来場者数 = c(1820, 1345, 2060, 970, 1510),
売上高 = c(2184000, 1479500, 2678000, 1067000, 1737500),
stringsAsFactors = FALSE)
# 作成したデータの確認
HanbaiData
# データフレームをxlsxファイルをデスクトップに書き出し
write_xlsx(
HanbaiData,
path = file.path(Sys.getenv("USERPROFILE"), "Desktop", "chokubai.xlsx"))
# WindowsでOneDriveを使っている場合は以下のコマンド
write_xlsx(
HanbaiData,
path = file.path(Sys.getenv("OneDrive"), "Desktop", "chokubai.xlsx"))
# ファイルが生成されたかを確認
file.exists("chokubai.xlsx")xオプションに名前付きのリストを渡すと、リスト名がシート名になります。split関数と組み合わせると、集計単位ごとにシートを分けたブックを一度に作成できます。
# 所在地ごとにデータを分割して名前付きリストを作成
SheetList <- split(HanbaiData, HanbaiData$所在地)
# リストの名前がシート名になるため内容を確認
names(SheetList)
# リストを渡して複数シートのブックを作成
write_xlsx(SheetList, file.path(Sys.getenv("OneDrive"), "Desktop", "chokubai.xlsx"))
[セルにExcelの数式を埋め込む]:xl_formulaコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| x | 数式として解釈する文字ベクトルを指定、各要素は「=」で始める必要がある | なし |
| format | セルへ適用するxl_formatオブジェクト、または要素ごとのxl_formatのリストを指定 | NULL |
Rで計算した数値をそのまま書き出すのではなく、計算の手順を数式のまま渡します。書き出したファイルをExcelで開くと再計算されるため、受け取った側が来場者数や売上高を修正すると、客単価も自動で更新されます。
# 数式が参照する行番号を作成、見出し行の分だけ1を加える
Gyou <- seq_len(nrow(HanbaiData)) + 1
# 売上高(D列)を来場者数(C列)で割る数式を客単価の列として追加
HanbaiData$客単価 <- xl_formula(paste0("=ROUND(D", Gyou, "/C", Gyou, ", 0)"))
# 追加した列の内容を確認
HanbaiData$客単価
[xl_cell_general: 5 cells]
[1] formula==ROUND(D2/C2, 0)
[2] formula==ROUND(D3/C3, 0)
[3] formula==ROUND(D4/C4, 0)
[4] formula==ROUND(D5/C5, 0)
[5] formula==ROUND(D6/C6, 0)[セルにハイパーリンクを設定する]:xl_hyperlinkコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| url | リンク先URLの文字ベクトルを指定、NAは空欄のセルになる | なし |
| value | セルに表示する文字ベクトルを指定、NULLはURLをそのまま表示する | NULL |
| format | セルへ適用するxl_formatオブジェクト、または要素ごとのxl_formatのリストを指定 | NULL |
| name | valueの旧称、後方互換のために残されており指定すると警告が表示される | NULL |
HYPERLINK関数の形でセルへ書き込まれます。数式として保存されるため、編集可能なリンクです。
# 各直売所の紹介ページのURLを作成
URLList <- paste0("https://example.com/chokubai/",
c("odori", "maruyama", "shiroishi", "teine", "atsubetsu"))
# URLと表示テキストを指定してハイパーリンクの列を追加
HanbaiData$紹介ページ <- xl_hyperlink(URLList, "紹介ページ")
# 追加した列の内容を確認
HanbaiData$紹介ページ
# 数式とハイパーリンクを含むデータをxlsxファイルとして書き出し
write_xlsx(HanbaiData, path = "chokubai_link.xlsx")
# 作成したファイルをまとめて削除
unlink(c("chokubai.xlsx", "chokubai_ku.xlsx", "chokubai_link.xlsx"))
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。