キャプテンアメリカが一晩でやってくれました。
こんな話があったそうです。
Is it possible to import data entered in MS Word into R - I have multiple tables in 235 files that need importing #rstats
— Richard Telford (@richardjtelford) August 23, 2015
これに対し、Rudisは「Yes」と答え、たった数時間のうちに素晴らしいパッケージを開発しました。
パッケージ開発の経緯や詳細についてはRudisの記事を見てください。
- Using R To Get Data Out Of Word Docs | rud.is
- New Pacakge “docxtractr” – Easily Extract Tables From Microsoft Word Docs | rud.is
ちょっとした説明をすると、Microsoftのofficeファイル(.docxや.xlsx)はXMLで記述されているので、うまいこと処理すればデータを抽出できます。**{docxtractr}
**はこの処理を関数としてまとめ、パッケージとして提供するものです。GitHubにリポジトリがあるのでインストールして試してみました。
こんなテーブル(7 * 5)を2つもつファイル(npb.docx
)を用意しました。
どう見てもわーどふぁいるです。本当にありがとうございました。という感じでここからデータ抽出する、という話は手打ちでやる必要があったり、見ただけで嫌になるわーどふぁいる内での表データです。
ですが、**{docxtractr}
**を使えばそんな気だるさとおさらば!R上でさくっと表データを扱うことができます。
まずはGitHubからパッケージをインストールしてきます。
# devtools::install_github("hrbrmstr/docxtractr")
library(docxtractr)
docxファイルを読み込む
read_docx
関数を使って表データが含まれる.docx
ファイルを読み込みます。
doc.table <- read_docx(path = "npb.docx")
doc.table # docx_describe_tbls(doc.table)
## Word document [npb.docx]
##
## Table 1
## total cells: 35
## row count : 7
## uniform : likely!
## has header : likely! => possibly [順位, 球団名, 勝ち, 負け, 分け]
##
## Table 2
## total cells: 35
## row count : 7
## uniform : likely!
## has header : likely! => possibly [順位, 球団名, 勝ち, 負け, 分け]
class(doc.table)
## [1] "docx"
docx
というクラスのオブジェクトです。出力を見ると、どのような表なのかがわかります。
# 読み込んだdocxファイル中に含まれる表の数
docx_tbl_count(doc.table)
## [1] 2
個々の表データを取り出す
docx_extract_tbl
を使って、一つ一つの表データを取り出すことができます。また、Rのデータフレーム操作と同様の添字処理なども可能です。
docx_extract_tbl(docx = doc.table, tbl_number = 1, header = TRUE)
## Source: local data frame [6 x 5]
##
## 順位 球団名 勝ち 負け 分け
## 1 1 阪神 60 52 1
## 2 2 巨人 59 56 1
## 3 3 ヤクルト 56 57 1
## 4 4 広島 52 57 1
## 5 5 DeNA 52 62 1
## 6 6 中日 50 62 2
docx_extract_tbl(docx = doc.table, tbl_number = 2, header = TRUE)[2]
## Source: local data frame [6 x 1]
##
## 球団名
## 1 ソフトバンク
## 2 日ハム
## 3 西武
## 4 ロッテ
## 5 楽天
## 6 オリックス
docx_extract_tbl(docx = doc.table, tbl_number = 2, header = TRUE) %>%
dplyr::filter(`勝ち` > 50) %>%
knitr::kable()
順位 | 球団名 | 勝ち | 負け | 分け |
---|---|---|---|---|
1 | ソフトバンク | 71 | 34 | 3 |
2 | 日ハム | 65 | 46 | 1 |
3 | 西武 | 54 | 56 | 5 |
4 | ロッテ | 52 | 55 | 1 |
こうしてdocx
から取り出したオブジェクトはtbl_df
およびdata.frame
クラスとなり、R上で扱いやすい形式になります。日本語でも問題ないようですし、このパッケージで救われる人がたくさん出そうですね。素晴らしい。