0

例として 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」に分類する必要があります。

これが何とか解決できることを願っています。ありがとうございました。

4

2 に答える 2

1

ベース R とcut:

mtcars <- subset(mtcars, select = c("cyl", "disp"))
mtcars$median_split <- ifelse(mtcars$disp <= median(mtcars$disp), "below_median","above_median")
mtcars$quantile_split <- cut(mtcars$disp, breaks = c(0, quantile(mtcars$disp)),labels = c("1_quartile",paste0(1:4, "_quartile")))

cut関数を使用してブレークに最小値が含まれていること (または NA が返されること) と、最小値が含まれていることを確認するときは注意してください。第 1 四分位数でラベル付けされます。

于 2019-07-24T21:47:22.037 に答える