まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

assertrでRの中間データをチェックする

データを加工するときに、未加工と最終加工結果は値がおかしくないかチェックすることがわりかしあると思うが、最終結果に至る途中段階をチェックすることは手間がかかる。

そのようなとき、assertrではRのパイプラインの途中に入れることで、その段階において、指定した条件に当てはまっていない場合警告(assert)がされるようになる。
なお、特に問題がない場合はassertr部分がない通常状態と同様の出力がされる。

github.com

データはmtcarsを使う。

head(mtcars)

# mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

また、今回以下のサイトをおおいに参考にさせてもらった。

uribo.hatenablog.com

assert系

列にはassert、行にはasset_rowを用いて以下の関数を渡す。

not_na

値にNAが含まれる場合警告

library(assertr)

mtcars %>% 
  mutate(hoge = NA) %>% 
  assert(not_na, hoge) # hoge列にNAがあると警告
# Column 'hoge' violates assertion 'not_na' 32 times
# verb redux_fn predicate column index value
# 1 assert       NA    not_na   hoge     1    NA
# 2 assert       NA    not_na   hoge     2    NA
# 3 assert       NA    not_na   hoge     3    NA
# 4 assert       NA    not_na   hoge     4    NA
# 5 assert       NA    not_na   hoge     5    NA
# [omitted 27 rows]

within_bounds

値が指定した範囲外の場合警告

# assert+within_boundsで範囲assert
mtcars %>% 
  assert(within_bounds(0, 6), cyl) %>% # cylが0~6を取ってないと警告。正数全てを使いたい場合Infを使ってhwithin_bounds(0, Inf)をする
  group_by(am) %>% 
  summarise(sum_mpg = sum(mpg))

# => cylが0~6にないレコードが14あり先頭5つを出力

# Column 'cyl' violates assertion 'within_bounds(0, 6)' 14 times
# verb redux_fn           predicate column index value
# 1 assert       NA within_bounds(0, 6)    cyl     5     8
# 2 assert       NA within_bounds(0, 6)    cyl     7     8
# 3 assert       NA within_bounds(0, 6)    cyl    12     8
# 4 assert       NA within_bounds(0, 6)    cyl    13     8
# 5 assert       NA within_bounds(0, 6)    cyl    14     8
# [omitted 9 rows]
# 
# エラー: assertr stopped execution

in_set

与えた文字列/数値の組み合わせ以外がある場合警告

mtcars %>% 
  assert(in_set(1,2), vs) # vsに1,2以外の値がないか
# Column 'vs' violates assertion 'in_set(1)' 18 times
# verb redux_fn predicate column index value
# 1 assert       NA in_set(1)     vs     1     0
# 2 assert       NA in_set(1)     vs     2     0
# 3 assert       NA in_set(1)     vs     5     0
# 4 assert       NA in_set(1)     vs     7     0
# 5 assert       NA in_set(1)     vs    12     0
# [omitted 13 rows]

verify系

verify内に条件式を書いてFalseの場合警告

mtcars %>%
  verify(mpg >30.0 && drat > 0)

# verb redux_fn            predicate column index value
# 1 verify       NA mpg > 30 && drat > 0     NA     1    NA
# 
# エラー: assertr stopped execution