【发布时间】:2017-03-14 19:06:17
【问题描述】:
我想使用 dplyr 包中的 ntile 来生成分位数向量。当我将数据划分到的组数量较少时,就会出现问题。
例如,如果我有一个-1 和1 的向量,则值-1 应该在分位数1 中,值1 应该在分位数2 中:
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() 解决方案。
【问题讨论】:
-
ntile()函数拆分数据,因此每个组具有大致相同数量的值。如果你全是 1 并要求两组,那么 1/2 将分配给第一个,1/2 分配给第二个。听起来你可能真的不想要分位数?如果您的值已经是离散的,也许只是将它们作为因素?我真的不知道你在这里期望什么行为。 -
我预计会与中值相比有所下降,而不是平均值。因此,预计两个分位数中的元素数量不会相同。
-
那么如果你有所有的 1 并且你请求 3 个组;行为会是什么?
-
那不会发生。在我的真实数据中,不同数据点的最少数量为 2,在这种情况下分位数为 2。
-
也许this post about splitting a variable into groups 是相关的,
ggplot2包中的cut_number函数可能会有所帮助