【R】 文章内で「和暦⇒西暦」に変換するパッケージ作った。

# 1. 趣旨

スクレイピングしたデータをそのままdata.frame等に変換して時系列分析をやろうとすると、年データがスクレイピング先によっては和暦で書かれていることがあり、**「文章は保持しつつ、和暦を全て西暦に直したい！」**ということがありました。

イメージとしては、こんな感じに変換したいわけです。

```
恐らく平成20年に生まれた人は、令和元年にはもう11歳になっているのだろう。
　↓
恐らく2008年に生まれた人は、2019年にはもう11歳になっているのだろう。
```

つまり、単純に和暦データを西暦に直せば済むという訳ではなく、**あくまで文章の中で変換したい**というのが今回のポイントです。

<BR><BR>
という記事<font color = "#BBBBBB">『【R】 文章内で「和暦⇒西暦」に変換する関数作った。』</font>を2020/01/23に一旦書いて公開したのですが・・・

**「折角作ったし、ここまで来たらパッケージにしたほうが使いやすいよね!!」**
ということで、元記事を削除してリメイクしました。


# 2. パッケージのインストールと読み込み

`{wareki}`というパッケージを[GitHub](https://github.com/zakkii11/wareki)にアップロードしたので、導入しましょう。


```R
library(devtools)
devtools::install_github("zakkii11/wareki")
library(wareki)
```

## 環境

- R 3.6.2
- RStudio 1.2.5033
- 必要パッケージ
    - dplyr
    - magrittr
    - stringr

# 3. 実際の動作

## wareki()

```R
> wareki("令和2年1月23日")
[1] "2020年1月23日"
```
```R
> wareki("平成25年度卒業式")
[1] "2013年度卒業式"
```
```R
> wareki("昭和2年昭和3年")
[1] "1927年1928年"
```
```R
> wareki("恐らく平成20年に生まれた人は、令和元年にはもう11歳になっているのだろう。")
[1] "恐らく2008年に生まれた人は、2019年にはもう11歳になっているのだろう。"
```

## wareki() と wareki2()の違い
GitHub上には、`wareki2.R`というファイルがあり、`wareki2()`という関数が書かれています。

```R
> wareki("平成30年")
[1] "2018年"
> wareki2("平成30年")
[1] "2018年"

> wareki("平成30")
[1] "平成30"
> wareki2("平成30")
[1] "2018"
```

`wareki()`は「平成○○年」のように、「元号」と「年」の文字列に挟まれた数字を変換の対象とします。つまり、変換対象になるには「年」という文字が必要です。
それに対して、`wareki2()`は「平成○○」のように、「元号」に続く数字を変換の対象とします。「年」という文字がなくても変換の対象になります。

`wareki2()`のほうが変換対象が広いですが、逆に不要な変換をしてしまう可能性もあります。
`wareki()`のほうが安全な変換が可能ですが、文書の性質に応じて使い分けてください。


# 4. zipanguパッケージとの比較

この関数と似たようなことが実現できるパッケージとして`{zipangu}`というパッケージが存在します。
https://uribo.hatenablog.com/entry/2019/12/02/163114

このパッケージには、和暦を西暦に変換する関数があるのですが、こんな感じで動作します。

```R
> library(zipangu)
> convert_jyear("平成2年")
[1] 1990
```

<BR>
さて、僕の`wareki()`との違いは何か、次の例を見るとお分かりいただけると思います。



```R:和暦より前に文章が続く場合
> wareki("恐らく平成20年に生まれた")
[1] "恐らく2008年に生まれた"

> convert_jyear("恐らく平成20年に生まれた")
[1] NA
 警告メッセージ: 
Unsupported Japanese imperial year.
Please include the year after 1868 or the year used since then, Meiji, Taisho, Showa, Heisei and Reiwa. 
```


```R:和暦より後に文章が続く場合
> wareki("平成25年度卒業式")
[1] "2013年度卒業式"

> convert_jyear("平成25年度卒業式")
[1] 2013
```


```R:テキストに複数の和暦が含まれている場合
> wareki("昭和2年昭和3年")
[1] "1927年1928年"

> convert_jyear("昭和2年昭和3年")
[1] 1927
```

```R:テキストに和暦が含まれていない
> wareki("平成はいい時代だった")
[1] "平成はいい時代だった"

> convert_jyear("平成はいい時代だった")
[1] NA
```


<BR>


| 違い | wareki() | convert_jyear() |
| --- | --- | ---|
|**出力オブジェクト**| character |numeric|
|**和暦より前の文章**|残る|NAを返す|
|**和暦より後の文章**|残る|残らない|
|**テキストに複数の和暦が含まれる場合**|全て変換される|先頭に最も近い和暦のみ変換される|
|**テキストに和暦が含まれていない場合**|元テキストを返す|NAを返す|

<BR>
冒頭の趣旨で説明した**「文章は保持しつつ和暦を西暦に変換」**ということが、`convert_jyear()`では実現できなかったですが、今回作った`wareki()`だと実現できます。


# 5. 課題
この辺はおいおい修正していきたいです。

- 漢数字に対応してません。
- 対応元号は令和～元和（1615）まで
- 旧字体は、一部（應・德・寶・祿）を除いて非対応。


# 6. まとめ


ちなみに、これが初めてのパッケージ作りです。
一回作ると、こんなに大変なんだーって思いました。皆すごいですね。
~~その辺の話は、どっかで書きたいです。~~
コチラに書きました。
[【R】 初めてのパッケージ作成で迷った5つのコト。 - Qiita](https://qiita.com/zakkiiii/items/b5b98ca1096b40739dee)

~~あと、関数の引数の説明とか、とにかく英語が死ぬほどゴミです。~~

Enjoy!


おしまい。

## 参考文献

パッケージ作りに際しては、以下の記事を死ぬほど参考にさせて頂きました。
ありがとうございました。

- [こわくないRパッケージ開発！2016 - Qiita](https://qiita.com/wakuteka/items/54f81f32baf50e243461)
- [Rパッケージ開発時に利用するデータの種類とその使い分け - cucumber fles](https://uribo.hatenablog.com/entry/2016/02/09/053000)