cut返回保证的箱数

时间:2012-06-22 02:11:14

标签: r

我想做一个有保证的等级返回的剪辑。因此,我想采用累积百分比的任何向量,并切入十分位数。我尝试过使用cut并且它在大多数情况下运行良好,但是在有大百分比的十分位数的情况下,它无法返回所需数量的独特切割,即10。关于如何确保数量的任何想法削减保证是10?

在所包含的例子中,没有出现十分位数7.

> (x <- c(0.04,0.1,0.22,0.24,0.26,0.3,0.35,0.52,0.62,0.66,0.68,0.69,0.76,0.82,1.41,6.19,9.05,18.34,19.85,20.5,20.96,31.85,34.33,36.05,36.32,43.56,44.19,53.33,58.03,72.46,73.4,77.71,78.81,79.88,84.31,90.07,92.69,99.14,99.95))
 [1]  0.04  0.10  0.22  0.24  0.26  0.30  0.35  0.52  0.62  0.66  0.68  0.69  0.76  0.82  1.41  6.19  9.05 18.34 19.85 20.50 20.96 31.85 34.33
[24] 36.05 36.32 43.56 44.19 53.33 58.03 72.46 73.40 77.71 78.81 79.88 84.31 90.07 92.69 99.14 99.95
> (cut(x,seq(0,max(x),max(x)/10),labels=FALSE))
 [1]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  2  2  3  3  4  4  4  4  5  5  6  6  8  8  8  8  8  9 10 10 10 10
> (as.integer(cut2(x,seq(0,max(x),max(x)/10))))
 [1]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  2  2  3  3  4  4  4  4  5  5  6  6  8  8  8  8  8  9 10 10 10 10
> (findInterval(x,seq(0,max(x),max(x)/10),rightmost.closed=TRUE,all.inside=TRUE))
 [1]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  2  2  3  3  4  4  4  4  5  5  6  6  8  8  8  8  8  9 10 10 10 10

我希望得到10个大致相同大小的间隔,大小以确保得到10. cut和al给出9个箱子这个例子,我想要10.所以我正在寻找一个算法会认识到[58.03,72.46],73.4之间的间隔很大。它不会分配给箱子6,8,8,而是将这些箱子分配给箱子6,7,8。

4 个答案:

答案 0 :(得分:3)

xx <- cut(x, breaks=quantile(x, (1:10)/10, na.rm=TRUE) )
table(xx)
#------------------------
    xx
(0.256,0.58] (0.58,0.718] (0.718,6.76]  (6.76,20.5] 
           4            4            4            4 
 (20.5,35.7]  (35.7,49.7]  (49.7,75.1]  (75.1,85.5] 
           3            4            4            4 
  (85.5,100] 
           4 

答案 1 :(得分:1)

我不确定我理解您的需求,但如果您放弃labels=FALSE并使用table制作数据频率表,您将获得所需类别的数量:

> table(cut(x, breaks=seq(0, 100, 10)))

(0,10]  (10,20]  (20,30]  (30,40]  (40,50]  (50,60]  (60,70]  (70,80]  (80,90] (90,100] 
   17        2        2        4        2        2        0        5        1        4

请注意,第7类(60,70]中没有数据。

答案 2 :(得分:1)

numBins = 10
cut(x, breaks = seq(from = min(x), to = max(x), length.out = numBins+1))

输出:

...
...
...
10 Levels: (0.04,10] (10,20] (20,30] (30,40] (40,50] (50,60] ... (90,100]

这将产生大约相等间隔的10个箱。请注意,通过更改numBins变量,您可以获得大致相等间距的任意数量的二进制位。

答案 3 :(得分:-1)

您要解决的问题是什么?如果您不想要分位数,那么您的分割点几乎是任意的,因此您可以通过采样轻松创建十个分箱,而无需替换原始数据集。我意识到这是一种荒谬的方法,但我想指出一点:你可能会偏离轨道,但我们无法分辨,因为你没有解释你打算用垃圾箱做什么。例如,为什么一个箱子没有内容呢?