如何避免在R中自动合并Deciles?

时间:2017-10-12 11:33:01

标签: r dplyr grouping quantile

我是R的新手,很长一段时间以来我一直在面对这个问题。 每当我尝试使用'dplyr'包制作十分位数或四分位数时,我的十分位数就会合并为更少的组。 像我想要10个不同的组,而我只有6个,4个或有时只有3个。 我知道如果数据较少,R会尝试对小十分位进行分组/合并。 但我想避免这个问题。请帮忙! 谢谢!

代码是:

 mydata <- data.frame(col1= c(0,00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,3,12,5,65,23,65984,21,5469,321,6,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,5233,18000))

DecLocations <- quantile(mydata$col1, probs = c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))
mydata$decile <- findInterval(mydata$col1,c(-Inf,DecLocations, Inf))

require(dplyr)
mydata$decile<-factor(mydata$decile)
decile_grp<-group_by(mydata,decile)
decile_summ_test<-summarize(decile_grp, total_cnt=sum(col1))
decile_summ_test<-arrange(decile_summ_test, desc(decile))
View(decile_summ_test)

在这里,我只获得前6个Deciles,因为R合并了小十分位数。这就是我在这里要避免的。我期待得到所有10个十分位数,即使它们的数字非常小。

1 个答案:

答案 0 :(得分:0)

如果您查看了DecLocations向量,您会看到R创建了所有十分位数,但是当您应用带有十进制数的findInterval函数作为断点时,由于定义而删除了较低的十进制数findInterval函数的详细信息(请参阅?findInterval

帮助文件的一部分:

<强> 描述

给出vec中非递减断点的向量,找到包含x的每个元素的区间;即,如果i < - findInterval(x,v),则对于x v [i [j]]≤x[j]中的每个索引j <1。 v [i [j] + 1]其中v [0]:= - Inf,v [N + 1]:= + Inf,并且N < - length(v)。在两个边界处,返回的索引可能相差1,具体取决于rightmost.closed和all.inside的可选参数。

在这里你可以看到函数找到最大值。 j使得v [i [j]]≤x[j]&lt; v [i [j] + 1]。这就是十分之一掉落的原因。

如果你想在向量中表示所有十分位数,你必须将一些(随机?)方式的0分配给较低的十进制数。

DecLocations <- quantile(mydata$col1, probs = c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))
DecLocations
 10%  20%  30%  40%  50%  60%  70%  80%  90% 
   0    0    0    0    5   65  400  900 1400 

mydata$decile <- findInterval(mydata$col1,c(-Inf,DecLocations, Inf))
head(mydata)
  col1 decile
1    0      5
2    0      5
3    0      5
4    0      5
5    0      5
6    0      5