tabyl() まわり
便利な前処理(というか、データクレンジング)に関する関数が揃ったjanitorパッケージですが、他にも集計関係の関数が多々含まれています。
clean_names()
で書いた通り、日本語の文字は全て分割されて_
が付与されてしまう挙動があるので、その処理が噛んでしまうものは使えないのですが、いくつかは日本語列名でも対応できています。
やってみます。1次元のベクトルの場合。
天気 <- c("晴", "晴", "晴", "雨", "雨", "晴", "曇") tabyl(天気) 天気 n percent 雨 2 0.2857143 晴 4 0.5714286 曇 1 0.1428571
データ中にNA
があっても対応できて、NA
を分母に含んで割合を計算した列とNA
を除いた割合を計算した列が作られます。
天気 <- c("晴", "晴", "晴", "雨", "雨", "晴", NA) tabyl(天気) #> 天気 n percent valid_percent #> 雨 2 0.2857143 0.3333333 #> 晴 4 0.5714286 0.6666667 #> <NA> 1 0.1428571 NA
2次元も可能。3次元も対応できるようです(試してない)
df <- data.frame(天気 = c("晴", "晴", "晴", "雨", "雨", "晴", "曇"), 進捗=c("ダメ", "良い", NA, "良い", "良い", "ダメ", "ダメ")) janitor::tabyl(df) #> 天気 ダメ 良い NA_ #> 雨 0 2 0 #> 晴 2 1 1 #> 曇 1 0 0
NA
は列名にする際にNA_
にするようです。
この結果を割合にすることも可能。
janitor::tabyl(df) %>% adorn_percentages() #> 天気 ダメ 良い NA_ #> 雨 0.0 1.00 0.00 #> 晴 0.5 0.25 0.25 #> 曇 1.0 0.00 0.00
タイトルというか、列方向の項目名をつけてくれます。
jtab %>% adorn_title() #> 進捗 #> 天気 ダメ 良い NA_ #> 雨 0 2 0 #> 晴 2 1 1 #> 曇 1 0 0
合計を追加。
#> jtab %>% adorn_totals(where = "row") #> 天気 ダメ 良い NA_ #> 雨 0 2 0 #> 晴 2 1 1 #> 曇 1 0 0 #> Total 3 3 1
さて、ここで列方向ですが、
jtab %>% adorn_totals(where = "col") #> Error in FUN(X[[i]], ...) : object 'ダ_メ' not found
でコケます。clean_namesを噛んでいるためでしょう。この場合、根本的にはデータ自体を書き換えないといけないのがちょっと厳しさを感じますね。
応急処置的に、列名を書き換えてみます。
jtab <- janitor::tabyl(df) colnames(jtab)<-c("weather", "bad", "good", "NA_") jtab %>% adorn_totals(where = "col") #> weather bad good NA_ Total #> 雨 0 2 0 2 #> 晴 2 1 1 4 #> 曇 1 0 0 1
出来ました。tabyl()
で処理した結果はtabyl
クラスとdata.frame
クラスであり、data.frame
に対して出来ることは何でもできます。View()
で見た場合はdata.frame
としての表示になります。
class(jtab) #> [1] "tabyl" "data.frame"
なので、適宜上記のように対応するのが苦労が少ないのかな…。あまり良い方法ではないですが、集計自体をデータの確認で使う場合はいけるところまで行った方が楽かなと。
集計結果が最終成果物であれば、データ自体を直しておいた方が良いとは思いますが…。
引数によるオプションの指定も含めてまだまだ色々できますが、長くなってきたのでこのあたりで。
日本語まわりの処理がうまくいけば、janitor
パッケージはかなり有用なパッケージになると思います。現時点でも十分強力だと思いますけどね。特にdirtyなexcelファイルを渡されたときのクレンジングからのピボットテーブルのような手軽な集計までがRで閉じるのはかなりQOLが上がると思います。アンケート調査等をされている方は特に使えるのではないのかなーと思っています。
日本語周り、どうすればよいのか現在調査中…(最終的にstringiパッケージに行きついて辛い気持ちになっている)
Enjoy!!