2

我想在保证返回的级别数的情况下进行削减。所以我想采用任何累积百分比的向量并将其分成十分位数。我试过使用 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 等人在这个例子中给出了 9 个 bin,我想要 10 个。所以我正在寻找一种能够识别的算法[58.03,72.46],73.4 之间的间隔很大。它不会将这些案例分配给箱 6、8、8,而不是分配给箱 6、7、8。

4

4 回答 4

4
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 
于 2012-06-22T03:20:35.940 回答
2
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 个大约等距的 bin。请注意,通过更改numBins变量,您可以获得任意数量的大约等间距的 bin。

于 2014-09-06T20:39:17.390 回答
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]

于 2012-06-22T02:45:55.363 回答
-1

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

于 2012-06-22T11:37:53.637 回答