Создание процентилей по отношению к общему R

#r #percentile

#r #процентиль

Вопрос:

Я пытаюсь разделить свои данные на процентили. Во-первых, вот несколько примеров данных:

 df <- data.frame(
  employee.first.name = c ('Jim', 'John', 'James', 'Jack', 'Jill', 'Kathy',
                           'Kim', 'Kelly', 'Karl', 'Larry', 'Lemon', 'Lime',
                           'Man', 'Mark', 'Mary', 'Miss', 'Molly',
                           'Matthew', 'Nancy', 'Nelly'),
  week.pay = c(401, 70, 58, 130, 483, 464, 84, 327, 208,
               254, 306, 393, 270, 54, 279, 390, 144,
               97, 125, 403
  )
)
 

Я могу разбить week.pay на процентили, используя cut2 функцию:

 library(Hmisc)
cut2(df$week.pay, g = 4, levels.mean = FALSE)
 

Я хотел бы разделить по процентам от общей заработной платы на квартили. Например, в приведенных выше данных 25% от общей суммы оплаты составляет 1235. Проведя некоторые расчеты, я могу обнаружить, что если мы посмотрим на сумму недельной зарплаты в диапазоне от 1 до 255, то примерно вернемся к сумме в 25%.

Я хотел бы знать диапазоны оплаты, которые соответствуют каждому квартилю. Как я могу быстро выполнить это в R?

Извините за мое бедное название — кажется, я не могу правильно сформулировать то, что я хочу. Утро понедельника после праздничных выходных складывается не слишком удачно :).

Спасибо!

Ответ №1:

Я думаю, вы спрашиваете о квартилях для совокупной оплаты. Как вы заметили, нам нужно разделить общую сумму оплаты на четыре, чтобы получить квартили. Таким образом, мы можем получить квартили с точки зрения оплаты:

 sorted.pay <- sort(df$week.pay)
cum.pay <- cumsum(sorted.pay)
brk <- floor(cum.pay/(sum(sorted.pay/4)))
brk <- ifelse(brk > 3, 3, brk)   # Include highest pay in 4th group
sapply(split(sorted.pay, brk), range)
#        0   1   2   3
# [1,]  54 270 390 403    # Min
# [2,] 254 327 401 483    # Max
table(brk)
# brk
#  0  1  2  3 
# 10  4  3  3 
 

Итак, 10 человек в самом низком квартиле получают зарплату от 54 до 254, в то время как 3 человека на вершине получают зарплату от 403 до 483. 10 нижних сотрудников получают 1/4 от общей заработной платы, а 3 верхних получают 1/4 от общей заработной платы.

Ответ №2:

Я считаю, что то, чего вы пытаетесь достичь, похоже на

 cut(
    x = df$week.pay
    , breaks = quantile(
         df$week.pay
         , probs = seq(0, 1, 0.25)
         , names = FALSE
         , type = 7)
    , include.lowest = TRUE
)
 

quantile Функция с этим probs аргументом вычислит квартили для вас. Впоследствии cut вы измените свой исходный вектор данных в соответствии с этими квартилями.

Обратите внимание на type аргумент о том, как вычисляются квантили / квартили.