assertrでRの中間データをチェックする
データを加工するときに、未加工と最終加工結果は値がおかしくないかチェックすることがわりかしあると思うが、最終結果に至る途中段階をチェックすることは手間がかかる。
そのようなとき、assertr
ではRのパイプラインの途中に入れることで、その段階において、指定した条件に当てはまっていない場合警告(assert)がされるようになる。
なお、特に問題がない場合はassertr
部分がない通常状態と同様の出力がされる。
データは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
また、今回以下のサイトをおおいに参考にさせてもらった。
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