1. wtnVegna

    Posted

    wtnVegna
Changes in title
+{dplyr::filter}のfactor型処理後に、droplevels()でLevelsの要素を整える
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,111 @@
+#概要
+R言語でのデータ前処理を楽にしてくれる`{dplyr}`パッケージには、マトリクスデータから指定列の条件に合う行のみを抽出してくれる`filter()`という便利な関数がある。
+
+ただ`filter()`関数は、各列から因子(factor)型の種類を示す`levels`が抽出元のデータのままになる特徴がある。これをそのままにしておくと、例えば`{graphics::plot}`で余分な部分を含んでプロットしてしまう。そのため`droplevels()`関数を用いて、Levelsの要素を整えてあげる必要がある。
+
+以降にて、データの準備と抽出処理と調整までの、一連の説明とコードを記載する。
+(なお`{ggplot2}`パッケージであれば、調整せずとも簡単にプロットできる)
+
+#説明とコード
+##パッケージとデータの準備
+パッケージを読込(`{tidyverse}`のみでも可)
+
+```R
+library(dplyr) #0.7.1
+library(data.table) #1.10.4
+```
+「商品3種(apple,banana,orange)を担当者4人(A,B,C,D)が何個売ったか」のサンプルデータを生成
+
+```R
+set.seed(11)
+product <- sample(factor(c("apple","banana","orange")),size=30,replace=TRUE)
+number <- sample(c(1:10),size = 30,replace = TRUE)
+staff <- sample(factor(c("A","B","C","D")),size= 30,replace= TRUE)
+
+sales_dt <- data.table(PRODUCT = product,NUMBER = number,STAFF = staff)
+head(sales_dt)
+```
+|| PRODUCT | NUMBER | STAFF|
+|--:|--:|--:|--:|
+|1| apple |6|A|
+|2| apple |4|D|
+|3| banana |5|A|
+|4| apple |3|C|
+|5| apple|9|D|
+|6| orange|7|A|
+
+filter()関数で、「担当者AもしくはDの、appleの販売個数」と条件づけてデータを抽出。
+
+```R
+sales_dt %>%
+ filter(STAFF == "A" | STAFF =="D") %>%
+ filter(PRODUCT == "apple") -> filter_sales_dt
+```
+##抽出前後データの因子を確認
+
+抽出元の`sales_dt`の因子要素を確認する。
+
+```
+sapply(sales_dt, FUN = "levels")
+```
+
+```
+$PRODUCT
+[1] "apple" "banana" "orange"
+
+$NUMBER
+NULL
+
+$STAFF
+[1] "A" "B" "C" "D"
+```
+抽出後の`filter_sales_dt`の因子要素を確認する。
+
+```
+sapply(filter_sales_dt, FUN = "levels")
+```
+```
+$PRODUCT
+[1] "apple" "banana" "orange"
+
+$NUMBER
+NULL
+
+$STAFF
+[1] "A" "B" "C" "D"
+```
+どちらも同じ結果が表示されていることがわかる。
+(変数`$NUMBER`は整数(integer)型のため`NULL`表記)
+
+##droplevels()を用いてlevels要素を整える
+droplevels()を用いて、不要な因子型を取り除く。
+
+```R
+check_dt <- droplevels(filter_sales_dt)
+sapply(check_dt, FUN = "levels")
+```
+
+```
+$PRODUCT
+[1] "apple"
+
+$NUMBER
+NULL
+
+$STAFF
+[1] "A" "D"
+```
+
+なお、もしこの処理をしないでプロットすると、不要な担当者"B"と"C"まで含めてしまう。
+![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/76667/e515cff3-b9f9-6ed2-fd71-2a3ce0416d29.png)
+
+#最後に
+今後もしこのようにプロットされる事に遭遇したら、まず`Levels`を疑うことをオススメ。
+特にデータ型の取り扱いミスに、頻繁に遭遇する私にとって、`sapply()`はとても便利。
+
+##参照元
+Rで解析:不要な水準を取り除く「droplevels」コマンド
+https://www.karada-good.net/analyticsr/r-319
+
+How to drop unused levels after filtering by factor? [duplicate]
+https://stackoverflow.com/questions/26826865/how-to-drop-unused-levels-after-filtering-by-factor