2012-07-06 71 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