R !!!droplevels() * factor型のデータ(カテゴリー変数)で、 * データ処理中に、使われないレベルが残ってしまった場合、 * 使われないレベルを削除する !!例: PIDのうち20で始まるものだけを選んでサブセットを作る場合 !元データ {{pre 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")) *これだけやると以下のようになる {{pre 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に残ってしまっている * 値はないので、データとしては存在しないのに、、、 {{pre 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)) {{pre df_both2 <- df_both %>% dplyr::filter(startsWith(as.character(PID), "20")) %>% mutate(PID=droplevels(PID)) }} * これで、構造もきれいになる。 {{pre 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 ... }}