例として mtcars を使用すると、次のようになります。
mtcars <- subset(mtcars, select = c("cyl", "disp"))
値が中央値を下回っている/上回っていることを示す列と、値がどの四分位にあるかを示す列の 2 つの列を追加する方法 ただし、これはのグループごとに実行したいと思いcyl
ます。
これは私が望んでいる具体的な結果です:
cyl disp median_split quartile_split
Toyota Corolla 4 71.1 below_median 1st_quartile
Honda Civic 4 75.7 below_median 1st_quartile
Fiat 128 4 78.7 below_median 1st_quartile
Fiat X1-9 4 79 below_median 2nd_quartile
Lotus Europa 4 95.1 below_median 2nd_quartile
Datsun 710 4 108 median median
Toyota Corona 4 120.1 above_median 3rd_quartile
Porsche 914-2 4 120.3 above_median 3rd_quartile
Volvo 142E 4 121 above_median 4th_quartile
Merc 230 4 140.8 above_median 4th_quartile
Merc 240D 4 146.7 above_median 4th_quartile
Ferrari Dino 6 145 below_median 1st_quartile
Mazda RX4 6 160 etc… etc…
助けていただければ幸いです。ありがとうございました。
以下のakunの回答に続いて編集
列ではquartile_split
、akun の回答は、各 cyl グループの最低値を で残しましたNA
。以下を追加することでこれを修正できると思いました:
mtcars$quartile_split[is.na(mtcars$quartile_split)] <- "1_quartile" #not a very elegant solution
したがって、完全なコードは次のようになります。
library(dplyr)
mtcars <- subset(mtcars, select = c("cyl", "disp"))
# akrun's answer
mtcars <- mtcars %>%
group_by(cyl) %>%
mutate(median_split = c("above_median", "below_median")[1 +
(disp <= median(disp))],
quartile_split = cut(disp, breaks = quantile(disp),
labels = paste0(1:4, "_quartile")))
# addition
mtcars$quartile_split[is.na(mtcars$quartile_split)] <- "1_quartile" #not a very elegant solution
しかし、もっと注意深く見てみると、別の何かが正しくないこともわかりました。具体的には、cyl = 6
グループだけを見ると、次のようになります。
cyl disp median_split quartile_split
6 145 below_median 1_quartile
6 160 below_median 1_quartile
6 160 below_median 1_quartile
6 167.6 below_median 2_quartile
6 167.6 below_median 2_quartile
6 225 above_median 4_quartile
6 258 above_median 4_quartile
disp
このグループの中央値は 163.8 であるため、 の 2 台の車disp = 167.6
は「below_median」ではなく「above_median」に分類する必要があります。
これが何とか解決できることを願っています。ありがとうございました。