首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CUT和Quartile在R函数中生成中断

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

Stack Overflow用户
提问于 2012-07-31 03:40:03
回答 7查看 57.2K关注 0票数 25

some great advice from before之后,我现在编写我的第二个R函数,并使用类似的逻辑。然而,我正在尝试更多的自动化,并且可能变得太聪明了,这对我自己来说是件好事。

我想根据订单数量将客户分成五等份。下面是我这样做的代码:

代码语言:javascript
复制
# 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)

代码语言:javascript
复制
0-20   20-40   40-60    60-80   80-100 
40     39      44       38      36

您将在这里看到,在我的样本数据中,我创建了200个观察值,但通过table仅列出了197个观察值。剩下的3个是NA

现在,有一些clientID有一个'NA‘的五分位。似乎如果它们处于最低的中断,在本例中为1,则它们不包括在cut函数中。

有没有办法让cut包含所有的观察结果?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-07-31 03:49:06

尝试以下操作:

代码语言:javascript
复制
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 

我在您的cut函数中包含了include.lowest=TRUE,这似乎可以让它工作。有关更多详细信息,请参阅?cut

票数 27
EN

Stack Overflow用户

发布于 2015-01-22 03:49:40

在历史悠久的Hmisc包中也有cut2。它会减少分位数。

从帮助中:

函数类似于cut,但左端点是包含的,标签的形式是[lower,upper),除了最后一个间隔是lower,upper。如果给定了裁剪,则默认情况下将确保裁剪包括x的整个范围。此外,如果未给定裁剪,则将x裁剪为分位数组(g给定)或具有给定最小观察数(m)的组。

创建了一个类别对象,而cut创建了一个因子对象。

票数 7
EN

Stack Overflow用户

发布于 2016-08-13 19:18:12

您可以很容易地使用OneR packagebin函数中的content方法自动完成此操作

代码语言:javascript
复制
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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11728419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档