使用CUT和Quartile在R函数中生成中断

mik*_*sey 20 cut r

根据之前的一些很好的建议,我现在正在编写我的第二个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)
Run Code Online (Sandbox Code Playgroud)

table(df$Quintile)

0-20   20-40   40-60    60-80   80-100 
40     39      44       38      36
Run Code Online (Sandbox Code Playgroud)

你会在这里看到,在我的样本数据中,我创建了200个观察值,但只列出了197个table.剩下的3个是NA

现在,有一些对于五分位数具有"NA"的clientID.看起来如果他们处于最低休息时间,在这种情况下为1,那么他们就不会被包括在切割功能中.

有没有办法cut包容所有观察?

Edw*_*ard 22

请尝试以下方法:

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 
Run Code Online (Sandbox Code Playgroud)

我包含include.lowest=TRUE在你的剪切功能中,这似乎使它工作.有关?cut详细信息,请参阅

  • 第 6 行代码中应该有 x 而不是 df$orders 吗? (2认同)

Owe*_*wen 6

在古老的Hmisc包装中也有cut2.它确实进行了分位数削减.

从帮助:

像切割但左端点的功能是包容性的,标签的形式是[下,上],除了最后一个间隔是[下,上].如果给出剪切,默认情况下将确保剪切包括整个x范围.此外,如果没有给出切割,则将x切割成分位数组(给定g)或具有给定最小观察数(m)的组.cut创建了一个category对象,而cut2创建了一个factor对象.


von*_*njd 5

您可以使用OneR 包中函数中的content方法非常轻松地自动完成此操作:bin

library(OneR)
set.seed(700)

clientID <- round(runif(200, min = 2000, max = 3000), 0)
orders <- round(runif(200, min = 1, max = 50), 0)
df <- data.frame(cbind(clientID, orders))

df$Quintiles <- bin(df$orders, method = "content")
table(df$Quintile)
## 
## (0.952,9.8]    (9.8,19]   (19,31.4] (31.4,38.2]   (38.2,49] 
##          40          41          39          40          40
Run Code Online (Sandbox Code Playgroud)

(完全披露:我是这个包的作者)