在some great advice from before之后,我现在编写我的第二个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个观察值,但通过table仅列出了197个观察值。剩下的3个是NA
现在,有一些clientID有一个'NA‘的五分位。似乎如果它们处于最低的中断,在本例中为1,则它们不包括在cut函数中。
有没有办法让cut包含所有的观察结果?
发布于 2012-07-31 03:49:06
尝试以下操作:
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。
发布于 2015-01-22 03:49:40
在历史悠久的Hmisc包中也有cut2。它会减少分位数。
从帮助中:
函数类似于cut,但左端点是包含的,标签的形式是[lower,upper),除了最后一个间隔是lower,upper。如果给定了裁剪,则默认情况下将确保裁剪包括x的整个范围。此外,如果未给定裁剪,则将x裁剪为分位数组(g给定)或具有给定最小观察数(m)的组。
创建了一个类别对象,而cut创建了一个因子对象。
发布于 2016-08-13 19:18:12
您可以很容易地使用OneR package中bin函数中的content方法自动完成此操作
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(完全披露:我是这个包的作者)
https://stackoverflow.com/questions/11728419
复制相似问题