【word】docxtractrパッケージで.docx内の表からデータを抽出する【これはすごい】

**キャプテンアメリカが一晩でやってくれました。**

こんな話があったそうです。

<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">Is it possible to import data entered in MS Word into R - I have multiple tables in 235 files that need importing <a href="https://twitter.com/hashtag/rstats?src=hash">#rstats</a></p>&mdash; Richard Telford (@richardjtelford) <a href="https://twitter.com/richardjtelford/status/635362926904373248">August 23, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

これに対し、Rudisは「Yes」と答え、たった数時間のうちに素晴らしいパッケージを開発しました。

パッケージ開発の経緯や詳細についてはRudisの記事を見てください。

-   [Using R To Get Data *Out Of* Word Docs | rud.is](http://rud.is/b/2015/08/23/using-r-to-get-data-out-of-word-docs/)
-   [New Pacakge “docxtractr” – Easily Extract Tables From Microsoft Word Docs | rud.is](http://rud.is/b/2015/08/24/new-pacakge-docxtractr-easily-extract-tables-from-microsoft-word-docs/)

ちょっとした説明をすると、Microsoftのofficeファイル（.docxや.xlsx）はXMLで記述されているので、うまいこと処理すればデータを抽出できます。**`{docxtractr}`**はこの処理を関数としてまとめ、パッケージとして提供するものです。GitHubにリポジトリがあるのでインストールして試してみました。

こんなテーブル（7 \* 5）を２つもつファイル（`npb.docx`）を用意しました。

![npb.png](https://qiita-image-store.s3.amazonaws.com/0/19462/3c3367d1-4bc0-6c72-5c7e-51a3c1e8f923.png)

どう見てもわーどふぁいるです。本当にありがとうございました。という感じでここからデータ抽出する、という話は手打ちでやる必要があったり、見ただけで嫌になるわーどふぁいる内での表データです。

ですが、**`{docxtractr}`**を使えばそんな気だるさとおさらば！R上でさくっと表データを扱うことができます。

まずはGitHubからパッケージをインストールしてきます。

``` r
# devtools::install_github("hrbrmstr/docxtractr")
library(docxtractr)
```

## docxファイルを読み込む

`read_docx`関数を使って表データが含まれる`.docx`ファイルを読み込みます。

``` r
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 [順位, 球団名, 勝ち, 負け, 分け]

``` r
class(doc.table)
```

    ## [1] "docx"

`docx`というクラスのオブジェクトです。出力を見ると、どのような表なのかがわかります。

``` r
# 読み込んだdocxファイル中に含まれる表の数
docx_tbl_count(doc.table)
```

    ## [1] 2

## 個々の表データを取り出す

`docx_extract_tbl`を使って、一つ一つの表データを取り出すことができます。また、Rのデータフレーム操作と同様の添字処理なども可能です。

``` 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

``` r
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   オリックス

``` r
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上で扱いやすい形式になります。**日本語でも問題ないようですし、このパッケージで救われる人がたくさん出そうですね。素晴らしい。**