2012-07-06 72 views
1

我試圖用R函數quantcut()來重新編碼一個數字變量作爲與分位數相對應的因子。例如:在quantcut()中處理關係

> X 
[1] 6 4 9 6 1 2 5 3 5 7 10 7 2 7 7 5 6 6 3 4 6 4 2 7 6 7 
[27] 4 3 5 3 7 6 8 12 4 4 0 1 7 6 7 4 7 1 1 1 2 3 3 1 1 6 
[53] 5 3 1 1 1 3 3 3 1 1 3 1 1 1 3 3 0 1 3 1 8 5 3 0 0 2 
[79] 1 3 8 0 1 4 1 1 1 1 1 1 3 2 1 4 1 5 5 12 7 2 6 6 2 6 
[105] 0 1 4 1 4 0 7 3 2 1 1 8 5 5 3 0 5 6 2 4 2 2 2 6 4 2 
[131] 2 2 2 6 8 5 1 2 8 3 2 7 4 6 6 6 7 5 1 5 5 6 1 4 4 5 
[157] 6 2 4 7 2 4 10 6 3 5 2 2 6 6 2 4 5 7 4 5 11 6 6 8 2 4 
[183] 4 6 12 16 9 7 14 13 11 5 5 2 2 7 7 6 4 3 4 3 5 4 5 7 9 4 
[209] 3 12 4 4 4 8 7 6 1 3 6 7 5 5 6 9 6 4 7 8 5 6 3 6 4 7 
[235] 3 3 4 7 5 7 5 9 5 8 3 4 3 2 5 2 4 3 8 4 2 2 1 5 3 5 
[261] 8 5 6 4 5 1 1 2 6 2 7 2 4 4 3 3 4 10 5 6 10 2 5 5 0 1 
[287] 6 2 5 4 6 6 9 5 5 6 3 8 1 5 1 8 5 2 5 2 4 2 4 4 

bins=10 
labels = 1:bins 
library(gtools) 
x2 = quantcut(X, q = seq(0, 1, by=1/bins), labels=labels) 

我得到的錯誤: 「錯誤的cut.default(X [!標誌],打破= newquant,include.lowest = TRUE,: '遊' 是不是唯一的。」 我想這是因爲分位數有聯繫,但quantcut的文檔專門顯示了函數如何通過使用更少的間隔來處理聯繫的示例。無論我是否指定標籤參數,都會發生錯誤

任何建議都會

編輯:這裏是輸入變量X的代碼:

X = c(6L, 4L, 9L, 6L, 1L, 2L, 5L, 3L, 5L, 7L, 10L, 7L, 2L, 7L, 7L, 
5L, 6L, 6L, 3L, 4L, 6L, 4L, 2L, 7L, 6L, 7L, 4L, 3L, 5L, 3L, 7L, 
6L, 8L, 12L, 4L, 4L, 0L, 1L, 7L, 6L, 7L, 4L, 7L, 1L, 1L, 1L, 
2L, 3L, 3L, 1L, 1L, 6L, 5L, 3L, 1L, 1L, 1L, 3L, 3L, 3L, 1L, 1L, 
3L, 1L, 1L, 1L, 3L, 3L, 0L, 1L, 3L, 1L, 8L, 5L, 3L, 0L, 0L, 2L, 
1L, 3L, 8L, 0L, 1L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 4L, 
1L, 5L, 5L, 12L, 7L, 2L, 6L, 6L, 2L, 6L, 0L, 1L, 4L, 1L, 4L, 
0L, 7L, 3L, 2L, 1L, 1L, 8L, 5L, 5L, 3L, 0L, 5L, 6L, 2L, 4L, 2L, 
2L, 2L, 6L, 4L, 2L, 2L, 2L, 2L, 6L, 8L, 5L, 1L, 2L, 8L, 3L, 2L, 
7L, 4L, 6L, 6L, 6L, 7L, 5L, 1L, 5L, 5L, 6L, 1L, 4L, 4L, 5L, 6L, 
2L, 4L, 7L, 2L, 4L, 10L, 6L, 3L, 5L, 2L, 2L, 6L, 6L, 2L, 4L, 
5L, 7L, 4L, 5L, 11L, 6L, 6L, 8L, 2L, 4L, 4L, 6L, 12L, 16L, 9L, 
7L, 14L, 13L, 11L, 5L, 5L, 2L, 2L, 7L, 7L, 6L, 4L, 3L, 4L, 3L, 
5L, 4L, 5L, 7L, 9L, 4L, 3L, 12L, 4L, 4L, 4L, 8L, 7L, 6L, 1L, 
3L, 6L, 7L, 5L, 5L, 6L, 9L, 6L, 4L, 7L, 8L, 5L, 6L, 3L, 6L, 4L, 
7L, 3L, 3L, 4L, 7L, 5L, 7L, 5L, 9L, 5L, 8L, 3L, 4L, 3L, 2L, 5L, 
2L, 4L, 3L, 8L, 4L, 2L, 2L, 1L, 5L, 3L, 5L, 8L, 5L, 6L, 4L, 5L, 
1L, 1L, 2L, 6L, 2L, 7L, 2L, 4L, 4L, 3L, 3L, 4L, 10L, 5L, 6L, 
10L, 2L, 5L, 5L, 0L, 1L, 6L, 2L, 5L, 4L, 6L, 6L, 9L, 5L, 5L, 
6L, 3L, 8L, 1L, 5L, 1L, 8L, 5L, 2L, 5L, 2L, 4L, 2L, 4L, 4L) 

回答

2

好的,這個問題可以追溯到這裏,如你所說,70%和80%的分位數是相同的。 quantile在內部使用quantcut

quantile(X,probs=seq(0,1,0.1)) 
    0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100% 
0.0 1.0 2.0 3.0 3.6 4.0 5.0 6.0 6.0 8.0 16.0 

我看不出如何解決使用quantcut本身這個問題,但你總是可以只使用cutquantileunique結合梳理出來。據我所知,這是什麼quantcut無論如何都有內部關係。

result <- cut(X,unique(quantile(X,probs=seq(0,1,0.1))),include.lowest=TRUE) 

> result[2:10] 
[1] (3.6,4] (8,16] (5,6] [0,1] (1,2] (4,5] (2,3] (4,5] (6,8] 
#Levels: [0,1] (1,2] (2,3] (3,3.6] (3.6,4] (4,5] (5,6] (6,8] (8,16] 
> X[2:10] 
[1]  4  9  6  1  2  5  3  5  7 
+0

謝謝。我一直在玩這個,我不明白爲什麼它是第4級被省略而不是第8或第9級(因爲這些級別代表了並列分位數)。如果我調用級別(結果),它列出1:9。但是,如果我打電話給表(結果),則有0級的觀測值。0 – 2012-07-06 23:53:59

+1

@半通 - 我猜這是因爲分位數分組是'> 3到3.6',其中整數不可能下降成。你可能需要'落地'cut'函數的中斷點,以得到一些值落入該分組:result < - cut(X,unique(floor(quantile(X,probs = seq(0,1, 0.1)))),include.lowest = TRUE)' – thelatemail 2012-07-07 00:17:35

+0

有道理,謝謝。 – 2012-07-07 03:03:13