在R中,ntile和cut以及quantile()函数之间的区别是什么?

20

我找到了两个有关在R中计算分位数的主题。然而,这两种方法,即dplyr::ntilequantile()都会产生不同的输出结果。事实上,dplyr::ntile()无法正确输出十分位。

方法1:使用ntile()R:将数据集拆分为四分位数/十分位数。什么是正确的方法?主题中,我们可以使用ntile()

下面是我的代码:

vector<-c(0.0242034679584454, 0.0240411606258083, 0.00519255930109344, 
  0.00948031338483081, 0.000549450549450549, 0.085972850678733, 
  0.00231687756193192, NA, 0.1131625967838, 0.00539244534707915, 
  0.0604885614579294, 0.0352030947775629, 0.00935626135385923, 
  0.401201201201201, 0.0208212839791787, NA, 0.0462887301644538, 
  0.0224952741020794, NA, NA, 0.000984952654008562)

ntile(vector,10)

输出结果为:

ntile(vector,10)
5  5  2  3  1  7  1 NA  8  2  7  6  3  8  4 NA  6  4 NA NA  1

如果我们对此进行分析,我们会发现不存在第10个分位数!

方法2:使用quantile() 现在,让我们使用来自如何通过在数据框中按列排序快速形成组(四分位数、十分位数等)线程的方法。

这是我的代码:

as.numeric(cut(vector, breaks=quantile(vector, probs=seq(0,1, length  = 11), na.rm=TRUE),include.lowest=TRUE))

输出结果为:

 7  6  2  4  1  9  2 NA 10  3  9  7  4 10  5 NA  8  5 NA NA  1

从输出结果可以看出,它们完全不同。我在哪里出了问题?我很感激任何想法。

这是ntile()函数的一个bug吗?

1个回答

30

dplyr::ntile 中,NA 总是被排在最后(最高排名),这就是为什么在这种情况下您看不到第十个十分位数的原因。如果您想让十分位数不考虑NA,可以定义一个像我接下来使用的这里的函数:

ntile_na <- function(x,n)
{
  notna <- !is.na(x)
  out <- rep(NA_real_,length(x))
  out[notna] <- ntile(x[notna],n)
  return(out)
}

ntile_na(vector, 10)
# [1]  6  6  2  4  1  9  2 NA  9  3  8  7  3 10  5 NA  8  5 NA NA  1

此外,quantile 有9种计算分位数的方法,你正在使用默认值,即第7种方法(可以查看 ?stats::quantile 来了解不同的 type,以及这里进行相关讨论)。

如果你尝试

as.numeric(cut(vector, 
               breaks = quantile(vector, 
                                 probs = seq(0, 1, length = 11), 
                                 na.rm = TRUE,
                                 type = 2),
               include.lowest = TRUE))
# [1]  6  6  2  4  1  9  2 NA  9  3  8  7  3 10  5 NA  8  5 NA NA  1

使用 ntile 得到了与你相同的结果。

总之,这不是一个 bug,只是它们实现方式的不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接