2017-01-14 1 views
4

Я новичок в R и изучаю ее в основном через Stackoverflow. Я нашел два потока в этой теме для вычисления децилей в R. Однако оба метода, то есть dplyr::ntile и quantile(), дают разные результаты. Фактически, dplyr::ntile() не может выводить надлежащие децили.Разница между функцией ntile и cut и then quantile() в R

Метод 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 

Если проанализировать это, мы видим, что нет десятого квантиля!

Способ 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() функция?

ответ

5

В dplyr::ntileNA всегда последний (самый высокий ранг), и именно поэтому вы не видите в этом случае 10-го дециля. Если вы хотите децилями не считать NA с, вы можете определить функцию как одной 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 и here для обсуждения их).

Если вы пытаетесь

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.

Вкратце: это не ошибка, это просто разные способы их реализации.