LoginSignup
3
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-26

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!

おしまい。

参考文献

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1