2017-10-12 43 views
-2

我是R的新手,我一直在面对这个问题。 每当我试图使十分位数或四分位数使用“dplyr”包,我十分位获得合并到更少的组。 像欲10个不同的基团,而我只得到6,4或有时只3. 我知道R期望可以组/合并小十分位数,如果它有较小的数据。 但我想避免这个问题。请帮忙! 谢谢!如何避免在R中自动合并Deciles?

代码:

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个十进制数,即使它们的数目非常小。

+0

最小的可重复的例子? – CPak

+1

您应该提供一个简单的数据示例来说明您的问题以及您期望的输出内容。请不要在评论中添加代码;相反,用您的代码/示例/更新编辑原始帖子。 – CPak

+0

@CPAK现在完成了! – PerryThePlatipus

回答

0

如果你看看你DecLocations矢量你看到的是,R创建所有十分位,但是当你应用findInterval功能与十分位数断点,则下十分位数是由于findInterval函数的定义下降(见?findInterval

帮助文件的部分:

说明

给定vec中非递减断点的向量,找出包含x的每个元素的区间;即,如果我< - findInterval(X,V),用于在XV各索引j [I [j]的]≤X [j]的< v [I [j]的+ 1]其中v [0]:= - 天道酬勤, v [N + 1]:= + Inf,并且长度(v)为N <。在这两个边界处,返回的索引可能相差1,具体取决于rightmost.closed和all.inside的可选参数。

在这里你可以看到,该函数发现最大。 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