我发现了两个线程对这个话题在R.计算十分位数然而,这两种方法,即dplyr::ntile
和quantile()
产生不同的输出.实际上,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()
功能错误吗?
In dplyr::ntile
NA
始终是最后一个(最高等级),这就是为什么在这种情况下你没有看到第10个十分位数.如果您希望十分位数不考虑NA
S,你可以这样定义一个函数在这里,我用下一个:
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
s,这里有关于它们的讨论).
如果你试试
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,它只是实现它们的不同方式.