2017-10-12 90 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