ошибка hmisc :: wtd.quantile (…, веса = …), когда все значения равны NAs и / или все веса равны 0 или NAs

#r #hmisc

#r #hmisc

Вопрос:

Контекст: я вычисляю сводную статистику по группам, мне нужно использовать hmisc::wtd.quantile() функцию, потому что у меня есть частота каждого значения.

Проблема: иногда все значения равны NAs и / или все веса равны 0 или NAs. Затем wtd.quantile() выполняется сбой, если weights = ... заполнено. Сообщение об ошибке:

 Error in approx(cumsum(wts), x, xout = c(low, high), method = "constant",  : 
  zero non-NA points
  

Вопрос: знаете ли вы, как избежать такого поведения и получить ожидаемый NA результат (поскольку все значения равны NA …)?

Вот некоторый код для воспроизведения ошибки:

 library(Hmisc)

# ex dataset
set.seed(555)
df_NA = data.frame(values = rep(NA, 5),
                   weights = rnorm(5))

# the problem
with(df_NA, wtd.quantile(values, weights = weights, na.rm = TRUE)) # does not work

with(df_NA, wtd.quantile(values, na.rm = TRUE)) # work
# same as
with(df_NA, stats::quantile(values, na.rm = TRUE)) # work
  

Выходные данные и ошибка:

 > with(df_NA, wtd.quantile(values, weights = weights, na.rm = TRUE)) # does not work
Error in approx(cumsum(wts), x, xout = c(low, high), method = "constant",  : 
  zero non-NA points
> with(df_NA, wtd.quantile(values, na.rm = TRUE)) # work
  0%  25%  50%  75% 100% 
  NA   NA   NA   NA   NA 
> # same as
> with(df_NA, stats::quantile(values, na.rm = TRUE)) # work
  0%  25%  50%  75% 100% 
  NA   NA   NA   NA   NA 
  

Комментарии:

1. with(df_NA, if (all(is.na(values))) wtd.quantile(values, na.rm = TRUE) else wtd.quantile(values, weights = weights, na.rm = TRUE))

2. или with(df_NA, {if (all(is.na(values))) weights <- NULL; wtd.quantile(values, weights = weights, na.rm = TRUE)})

3. @Roland Большое спасибо, не стесняйтесь оставлять свой комментарий в качестве ответа! Я тестирую его на фактическом наборе данных.

4. Чтобы это сработало, мне пришлось добавить следующее: with(df_NA, if (all(is.na(values) | weights == 0 | is.na(weights))) wtd.quantile(values, na.rm = TRUE) else wtd.quantile(values, weights = weights, na.rm = TRUE))