【问题标题】:Using ntile to split into groups of 2 or 3使用 ntile 分成 2 或 3 组
【发布时间】:2017-03-14 19:06:17
【问题描述】:

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

例如,如果我有一个-11 的向量,则值-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

我也愿意接受cutquantile() 解决方案。

【问题讨论】:

  • ntile() 函数拆分数据,因此每个组具有大致相同数量的值。如果你全是 1 并要求两组,那么 1/2 将分配给第一个,1/2 分配给第二个。听起来你可能真的不想要分位数?如果您的值已经是离散的,也许只是将它们作为因素?我真的不知道你在这里期望什么行为。
  • 我预计会与中值相比有所下降,而不是平均值。因此,预计两个分位数中的元素数量不会相同。
  • 那么如果你有所有的 1 并且你请求 3 个组;行为会是什么?
  • 那不会发生。在我的真实数据中,不同数据点的最少数量为 2,在这种情况下分位数为 2。
  • 也许this post about splitting a variable into groups 是相关的,ggplot2 包中的cut_number 函数可能会有所帮助

标签: r dplyr


【解决方案1】:

这个功能怎么样

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

【讨论】:

  • 完美。它还可以很好地推广到更多样化的示例,例如quant_cut(runif(100),3)。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2023-03-27
  • 2015-09-24
相关资源
最近更新 更多