我是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个十分位数,即使它们的数字非常小。
答案 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