5

我有一组数据,如下所示:

annual_exp<-as.data.frame(c(6000,4200,240001,750,20000,3470,10500,2400,2280,36000,3600,20000,2000,12000,1200,3000,4500,64000))
annual_exp<-as.data.frame(annual_exp)

我想创建一个新变量,称为“五分位数”,它为每个观察值分配一个介于 1 和 5 之间的整数,包括 1 和 5,具体取决于它们属于哪个五分之一的收入支出 (annual_exp)。所以应该有相同数量的 1 到 5。

到目前为止,我的尝试是执行以下操作:

test<-quantile(annual_exp$annual_exp, probs= seq(0,1,0.2), na.rm=TRUE)
summary(test)
test

breaks<-c(test[1],test[2],test[3],test[4],test[5],test[6])
quantiles<-cut(annual_exp$annual_exp, breaks, labels=c("1","2","3","4","5"), include.lowest=TRUE, right=TRUE)
quantiles<-as.data.frame(quantiles)
quantiles<-cbind(annual_exp, quantiles)

问题(在这个例子中创建的这么小的样本并没有真正显示出来)是通过这样做落入每个分位数的人数变化很大。这是因为我使用了上面的“分位数”函数。

因此,我正在寻找等式中“分位数”部分的替代方案,它将根据样本的年度支出将样本分成 5 个相等的五分位数组。

对此的任何帮助将不胜感激!

4

2 回答 2

11

ggplot2有一个很好的实用功能,cut_number()它可以满足您的需求。

library(ggplot2)
as.numeric(cut_number(annual_exp[[1]], n = 5))
# [1] 3 3 5 1 4 2 4 2 1 5 3 4 1 4 1 2 3 5
于 2012-08-28T15:42:33.250 回答
3

这是使用data.table包的解决方案,这可能是最快的解决方案(如果您正在处理大型数据集,这是一个大问题)

library(data.table)

setDT(data)

data[ , newVarDecile := cut(varIncome,
                            breaks=quantile(varIncome,
                            probs=seq(0, 1, by=0.1), na.rm=T),
                            include.lowest= TRUE, labels=1:10) ]

如果您想为不同的子组分别计算十分位数,您只需要包含by =.

data[ , newVarQuintiles := cut(varIncome,
                               breaks=quantile(varIncome,
                               probs=seq(0, 1, by=0.2), na.rm=T),
                               include.lowest= TRUE, labels=1:5), 
                               by = groupVar ]

附言。请注意,在第二个示例中,我们通过更改probslabels参数计算了收入五分位数

于 2015-09-07T16:54:47.153 回答