我在这个主题上发现了两个用于计算R中十分位数的线程。但是,两个方法,即dplyr::ntile
和quantile()
产生不同的输出。实际上,dplyr::ntile()
无法输出正确的十分位数。
方法1:使用ntile()
从R: splitting dataset into quartiles/deciles. What is the right method?主题开始,我们可以使用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:使用分位数() 现在,让我们使用How to quickly form groups (quartiles, deciles, etc) by ordering column(s) in a data frame线程中的方法。
这是我的代码:
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()
函数中的错误吗?
答案 0 :(得分:13)
在dplyr::ntile
NA
总是最后(最高等级),这就是为什么在这种情况下你不会看到第10个十分位数。如果你想让十进制不考虑NA
s,你可以定义一个函数,就像我接下来使用的here一样:
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
和{{ 3}}关于他们的讨论)。
如果您尝试
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
的结果相同。
总结:它不是一个错误,只是它们的实现方式不同。