#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))