トップ 履歴 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

droplevels()

*disclaimer
1228259

R

droplevels()


  • factor型のデータ(カテゴリー変数)で、
  • データ処理中に、使われないレベルが残ってしまった場合、
  • 使われないレベルを削除する

 例: PIDのうち20で始まるものだけを選んでサブセットを作る場合


元データ

tibble [414 × 3] (S3: tbl_df/tbl/data.frame)
 $ PID     : Factor w/ 233 levels "1901","1902",..: 1 2 3 4 5 6 8 9 12 13 ...
 $ Year    : Factor w/ 2 levels "JH","SH": 1 1 1 1 1 1 1 1 1 1 ...
 $ MSD_mean: num [1:414] 2.2 1.68 1.64 1.64 1.74 ...

20で始まる人だけを選ぶ

dplyr::filter(startsWith(as.character(PID), "20")) 
  • これだけやると以下のようになる
tibble [140 × 3] (S3: tbl_df/tbl/data.frame)
 $ PID     : Factor w/ 233 levels "1901","1902",..: 76 77 78 79 80 81 82 83 85 86 ...
 $ Year    : Factor w/ 2 levels "JH","SH": 1 1 1 1 1 1 1 1 1 1 ...
 $ MSD_mean: num [1:140] 1.66 1.73 1.7 1.77 1.7 ...
  • PID: Factorに残ってしまっている
  • 値はないので、データとしては存在しないのに、、、
      PID      Year       MSD_mean    
 2002   :  2   JH:70   Min.   :1.576  
 2003   :  2   SH:70   1st Qu.:1.718  
 2004   :  2           Median :1.768  
 2005   :  2           Mean   :1.774  
 2006   :  2           3rd Qu.:1.830  
 2007   :  2           Max.   :2.071  
 (Other):128                          
  • これがトラブルのもとになるので、存在しないlevelを削除する
%>% mutate(PID=droplevels(PID))

df_both2 <- df_both %>% dplyr::filter(startsWith(as.character(PID), "20")) %>% mutate(PID=droplevels(PID)) 
  • これで、構造もきれいになる。
str(df_both2)

tibble [140 × 3] (S3: tbl_df/tbl/data.frame)
 $ PID     : Factor w/ 70 levels "2002","2003",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Year    : Factor w/ 2 levels "JH","SH": 1 1 1 1 1 1 1 1 1 1 ...
 $ MSD_mean: num [1:140] 1.66 1.73 1.7 1.77 1.7 ...