使用ntile分成2或3组

时间:2017-03-14 19:06:17

标签: r dplyr

我想使用包ntile中的dplyr来生成分位数向量。当我有少量的组将数据分成时,就会出现问题。

例如,如果我有-11的向量,则值-1应为分位数1,值1应为分位数2:< / p>

library(dplyr)
index2 <- rep(c(-1,1,-1),each=4) 
#[1] -1 -1 -1 -1  1  1  1  1 -1 -1 -1 -1

然而,使用ntile,最后两个数据点的分位数是错误的(2而不是1)

ntile(index2,2)
# [1] 1 1 1 1 2 2 2 2 1 1 2 2

这是我对index2分位数所期望的结果:

   #  1  1  1  1  2  2  2  2  1  1  1  1

我对n=3有同样的问题。结果并不像预期的那样。

index3 <- rep(c(-1,1,-2,-2),each=3)
#[1] -1 -1 -1  1  1  1 -2 -2 -2 -2 -2 -2
ntile(index3,3)
#[1] 2 2 3 3 3 3 1 1 1 1 2 2

这是我对index3分位数所期望的结果:

#  2  2  2  3  3  3  1  1  1  1  1  1

我也可以使用cutquantile()解决方案。

1 个答案:

答案 0 :(得分:4)

这个功能怎么样

quant_cut <- function(x, n) {
    qs <- quantile(x, 1:(n-1)/n)
    brks <- c(-Inf, qs, Inf)
    cut(x, breaks=brks, labels=FALSE)
}

我们计算分位数值,然后使用cut来破坏这些值(导致可能不均匀的分组)。例如

index2 <- rep(c(-1,1,-1),each=4) 
quant_cut(index2, 2)
#  [1] 1 1 1 1 2 2 2 2 1 1 1 1

index3 <- rep(c(-1,1,-2,-2),each=3)
quant_cut(index3,3)
# [1] 2 2 2 3 3 3 1 1 1 1 1 1