1. 趣旨
スクレイピングしたデータをそのままdata.frame等に変換して時系列分析をやろうとすると、年データがスクレイピング先によっては和暦で書かれていることがあり、**「文章は保持しつつ、和暦を全て西暦に直したい!」**ということがありました。
イメージとしては、こんな感じに変換したいわけです。
恐らく平成20年に生まれた人は、令和元年にはもう11歳になっているのだろう。
↓
恐らく2008年に生まれた人は、2019年にはもう11歳になっているのだろう。
つまり、単純に和暦データを西暦に直せば済むという訳ではなく、あくまで文章の中で変換したいというのが今回のポイントです。
という記事『【R】 文章内で「和暦⇒西暦」に変換する関数作った。』を2020/01/23に一旦書いて公開したのですが・・・
「折角作ったし、ここまで来たらパッケージにしたほうが使いやすいよね!!」
ということで、元記事を削除してリメイクしました。
2. パッケージのインストールと読み込み
{wareki}
というパッケージをGitHubにアップロードしたので、導入しましょう。
library(devtools)
devtools::install_github("zakkii11/wareki")
library(wareki)
環境
- R 3.6.2
- RStudio 1.2.5033
- 必要パッケージ
- dplyr
- magrittr
- stringr
3. 実際の動作
wareki()
> wareki("令和2年1月23日")
[1] "2020年1月23日"
> wareki("平成25年度卒業式")
[1] "2013年度卒業式"
> wareki("昭和2年昭和3年")
[1] "1927年1928年"
> wareki("恐らく平成20年に生まれた人は、令和元年にはもう11歳になっているのだろう。")
[1] "恐らく2008年に生まれた人は、2019年にはもう11歳になっているのだろう。"
wareki() と wareki2()の違い
GitHub上には、wareki2.R
というファイルがあり、wareki2()
という関数が書かれています。
> 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
このパッケージには、和暦を西暦に変換する関数があるのですが、こんな感じで動作します。
> library(zipangu)
> convert_jyear("平成2年")
[1] 1990
さて、僕の`wareki()`との違いは何か、次の例を見るとお分かりいただけると思います。
> 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.
> wareki("平成25年度卒業式")
[1] "2013年度卒業式"
> convert_jyear("平成25年度卒業式")
[1] 2013
> wareki("昭和2年昭和3年")
[1] "1927年1928年"
> convert_jyear("昭和2年昭和3年")
[1] 1927
> wareki("平成はいい時代だった")
[1] "平成はいい時代だった"
> convert_jyear("平成はいい時代だった")
[1] NA
違い | wareki() | convert_jyear() |
---|---|---|
出力オブジェクト | character | numeric |
和暦より前の文章 | 残る | NAを返す |
和暦より後の文章 | 残る | 残らない |
テキストに複数の和暦が含まれる場合 | 全て変換される | 先頭に最も近い和暦のみ変換される |
テキストに和暦が含まれていない場合 | 元テキストを返す | NAを返す |
冒頭の趣旨で説明した**「文章は保持しつつ和暦を西暦に変換」**ということが、`convert_jyear()`では実現できなかったですが、今回作った`wareki()`だと実現できます。
5. 課題
この辺はおいおい修正していきたいです。
- 漢数字に対応してません。
- 対応元号は令和~元和(1615)まで
- 旧字体は、一部(應・德・寶・祿)を除いて非対応。
6. まとめ
ちなみに、これが初めてのパッケージ作りです。
一回作ると、こんなに大変なんだーって思いました。皆すごいですね。
その辺の話は、どっかで書きたいです。
コチラに書きました。
【R】 初めてのパッケージ作成で迷った5つのコト。 - Qiita
あと、関数の引数の説明とか、とにかく英語が死ぬほどゴミです。
Enjoy!
おしまい。
参考文献
パッケージ作りに際しては、以下の記事を死ぬほど参考にさせて頂きました。
ありがとうございました。