如何避免R中小数的自动合并



我是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个十分位数,因为R合并了小的十分位数。这就是我在这里尽量避免的。我期望得到全部10个十分位数,即使它们的数字很小。

如果您查看DecLocations向量,您会发现R创建了所有的十分位数,但当您应用以十分位数为断点的findInterval函数时,由于findInterval函数的定义,较低的十分位数将被删除(请参阅?findInterval)

帮助文件的一部分:

描述

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

在这里,你可以看到函数找到最大值j,使得v[i[j]]≤x[j]<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

最新更新