cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

データフレームの変数を正しく扱うためにreadr::type_convert関数やreadr::parse関数群を使う

Rをやっていると時々、データ型の違いによる関数実行の失敗や不正確な結果の出力が起こる。errorで処理が停止したりwarningで間違っていることがわかると良いのだけど、間違ったデータ型で処理が通ってしまって、結果を見て「あれへんだな」ということがあると良くない。

(自分の中で)ありがちなのが、日付・時間型で扱いたい変数が文字列となっているような、うまくパースできていないという状況。うっかり日付・時間型のデータを入力に用いる関数に投げるとエラーになったりする。

library(tidyverse)
# 例のために文字列で「日付・時間」のデータを用意
(d <- data_frame(
  datetime = c("2017-07-12 08:30:11",
               "2017-07-12 09:10:36",
               "2017-07-12 10:43:42")
))
## # A tibble: 3 x 1
##              datetime
##                 <chr>
## 1 2017-07-12 08:30:11
## 2 2017-07-12 09:10:36
## 3 2017-07-12 10:43:42

日付・時間型として正しく扱うため、lubridate::as_datetime() (baseの関数であればas.POSIXct()か)を使えば良いのだけど、

d %>% mutate(
  datetime = lubridate::as_datetime(datetime)
)
## # A tibble: 3 x 1
##              datetime
##                <dttm>
## 1 2017-07-11 23:30:11
## 2 2017-07-12 00:10:36
## 3 2017-07-12 01:43:42

と書くのがちょっとだるい。そんな時には表題のreadrパッケージの関数type_convert()を使う。

# readrパッケージはtidyverseに含まれる
d %>% 
  type_convert()
## # A tibble: 3 x 1
##              datetime
##                <dttm>
## 1 2017-07-12 08:30:11
## 2 2017-07-12 09:10:36
## 3 2017-07-12 10:43:42

楽。

この関数は何をしているかというと、文字列として扱われているデータフレームの変数のデータ型をよしなに変換してくれるというもの(utilsにあるtype.convert()とは別物。話がそれるがこの関数の変換はあまりよろしくない気がする…)。

今回のように、本来、日付・時間や数値であるはずの変数が文字列になっている場合に使うと良いだろう。

また、readrにはベクトルを入力として、データ型をパースし直すparse_*関数群が備わっている。これはこれで便利。

d$datetime %>% parse_datetime()
## [1] "2017-07-12 08:30:11 UTC" "2017-07-12 09:10:36 UTC"
## [3] "2017-07-12 10:43:42 UTC"
d$datetime %>% parse_guess()
## [1] "2017-07-12 08:30:11 UTC" "2017-07-12 09:10:36 UTC"
## [3] "2017-07-12 10:43:42 UTC"
parse_datetime("2017年7月12日 9時20分", "%Y年%m月%d日 %H時%M分") 
## [1] "2017-07-12 09:20:00 UTC"
parse_date("2017-7-12", "%Y-%m-%d")
## [1] "2017-07-12"

readrパッケージに関しては

qiita.com

も参考までに。