在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
包含所有观察结果? 最佳答案
请尝试以下操作:
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
。关于r - 使用CUT和四分位数在R函数中产生中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11728419/