Получение наблюдений, соответствующих каждому квартилю

q <- quantile(faithful$eruptions)
> q
     0%     25%     50%     75%    100% 
1.60000 2.16275 4.00000 4.45425 5.10000 

Я получаю следующий результат, набор данных предоставляется в R.

 head(faithful)
  eruptions waiting
1     3.600      79
2     1.800      54
3     3.333      74
4     2.283      62
5     4.533      85
6     2.883      55

Мне нужен кадр данных, содержащий данные и дополнительный столбец для указания квантиля, к которому принадлежит каждое наблюдение. Например, окончательный набор данных должен выглядеть так

     eruptions waiting Quartile
1     3.600      79      Q1
2     1.800      54      Q2
3     3.333      74
4     2.283      62
5     4.533      85
6     2.883      55

Как это может быть сделано?


person darkage    schedule 25.02.2014    source источник


Ответы (3)


Что-то в этом роде? Используйте значения из функции quantile в качестве значений для вырезания нужного вектора.

faithful$kva <- cut(faithful$eruptions, q)
levels(faithful$kva) <- c("Q1", "Q2", "Q3", "Q4")
faithful

    eruptions waiting  kva
1       3.600      79   Q2
2       1.800      54   Q1
3       3.333      74   Q2
4       2.283      62   Q2
5       4.533      85   Q4
person Roman Luštrik    schedule 25.02.2014

Функция cut имеет возможность сразу создавать числовые метки для каждого квантиля:

faithful$Quartile <- cut(faithful$eruptions,
                         quantile(faithful$eruptions),
                         labels = FALSE)

Это создаст NA для наименьшего извержения, если вы хотите назначить наименьшее извержение первому квантилю, вы можете добавить include.lowest = TRUE при вызове функции cut:

faithful$Quartile <- cut(faithful$eruptions,
                         quantile(faithful$eruptions),
                         labels = FALSE,
                         include.lowest = T)
person ira    schedule 08.07.2018

Теперь это можно сделать более удобно через dplyr pipe и ggplot2::cut_number().

library(dplyr)
library(ggplot2)

faithful %>% 
   mutate(Quartile = cut_number(eruptions, n = 4, labels = c("Q1", "Q2", "Q3", "Q4")))

Самое низкое наблюдение включено по умолчанию, в отличие от базового R cut().

person Joe    schedule 05.09.2019