Использование CUT и Quartile для создания разрывов в функции R

после некоторые большие советы перед, теперь я пишу свою функцию 2nd R и использую аналогичную логику. Тем не менее, я пытаюсь автоматизировать немного больше и, возможно, становлюсь слишком умным для моего собственного блага.

Я хочу разбить клиентов на квинтили на основе количества заказов. Вот мой код:

# sample data
clientID <- round(runif(200,min=2000, max=3000),0)
orders <- round(runif(200,min=1, max=50),0)

df <- df <- data.frame(cbind(clientID,orders))

#function to break them into quintiles
ApplyQuintiles <- function(x) {
  cut(x, breaks=c(quantile(df$orders, probs = seq(0, 1, by = 0.20))), 
      labels=c("0-20","20-40","40-60","60-80","80-100"))
}

#Add the quintile to the dataframe
df$Quintile <- sapply(df$orders, ApplyQuintiles)

table(df$Quintile)

0-20   20-40   40-60    60-80   80-100 
40     39      44       38      36

вы увидите здесь, что в моих данных образца, я создал 200 наблюдений, но только 197 перечислены via table. 3 слева NA

теперь, есть некоторые идентификаторами клиента, что у 'нс' в квинтиле. Кажется, если они были на самом низком разрыве, в этом случае 1, то они не были включены в функцию разреза.

есть ли способ сделать cut включая все наблюдения?

4 ответов


попробуйте следующее:

set.seed(700)

clientID <- round(runif(200,min=2000, max=3000),0)
orders <- round(runif(200,min=1, max=50),0)

df <- df <- data.frame(cbind(clientID,orders))

ApplyQuintiles <- function(x) {
  cut(x, breaks=c(quantile(df$orders, probs = seq(0, 1, by = 0.20))), 
      labels=c("0-20","20-40","40-60","60-80","80-100"), include.lowest=TRUE)
}
df$Quintile <- sapply(df$orders, ApplyQuintiles)
table(df$Quintile)

0-20  20-40  40-60  60-80 80-100 
  40     41     39     40     40 

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


есть еще cut2 в почтенном пакете Hmisc. Это режет квантиль.

справка:

функция как отрезок но левые конечные точки включительны и ярлыки форма [нижний, верхний), за исключением последнего интервала [нижний, верхний]. Если разрезы заданы, по умолчанию убедитесь, что разрезы включают все диапазон x. Кроме того, если разрезы не заданы, будет вырезать x в квантиль группы (G задано) или группы с заданным минимальным числом из наблюдений (м.) В то время как cut создает объект категории, cut2 создает фактор объект.


вы можете очень легко выполнить это автоматически с content метод


Я использую аналогичную функцию для своих данных, и я обеспокоен тем, что мои квинтильные бункеры имеют разное количество наблюдений: это нормально? Спасибо!

jobs02.vq <- cut(meaneduc02v, breaks=c(quantile(meaneduc02v,  probs = seq(0,        1, by=0.20), 
                          na.rm=TRUE, names=TRUE, include.lowest=TRUE, right = TRUE, 
                          labels=c("1","2","3","4","5")))) # makes quintiles

и выход, который я получаю:

 table(jobs02.vq, useNA='ifany')
 jobs02.vq
 [1.00,2.00) [2.00,2.51) [2.51,3.34) [3.34,4.45) [4.45,5.33]        <NA> 
     82          54          69          64          67         123