我想使用包ntile
中的dplyr
来生成分位数向量。当我有少量的组将数据分成时,就会出现问题。
例如,如果我有-1
和1
的向量,则值-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
我也可以使用cut
和quantile()
解决方案。
答案 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