我想做一个有保证的等级返回的剪辑。因此,我想采用累积百分比的任何向量,并切入十分位数。我尝试过使用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。
答案 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)
您要解决的问题是什么?如果您不想要分位数,那么您的分割点几乎是任意的,因此您可以通过采样轻松创建十个分箱,而无需替换原始数据集。我意识到这是一种荒谬的方法,但我想指出一点:你可能会偏离轨道,但我们无法分辨,因为你没有解释你打算用垃圾箱做什么。例如,为什么一个箱子没有内容呢?