#r #data.table #warnings
#r #data.table #предупреждения
Вопрос:
Я обнаружил разницу в предупреждениях, используя fifelse
из data.table
библиотеки:
set.seed(123)
df <- data.table(ID = rep(1:10,each = 2),x = sample(c(1,NA),20,replace = T))
test1 <- df[,fifelse(any(!is.na(x)),max(x,na.rm = T),as.numeric(NA)),by = ID]
выдает предупреждение:
Предупреждающие сообщения 1: В max(x, na.rm = T): нет не пропущенных аргументов до max; возврат -Inf 2: В max(x, na.rm = T): нет не пропущенных аргументов до max; возврат -Inf
в то время как:
test2 <- df[,ifelse(any(!is.na(x)),max(x,na.rm = T),as.numeric(NA)),by = ID]
нет. И два результата идентичны:
identical(test1,test2)
[1] TRUE
И в результате нет -Inf. Что это значит?
Комментарии:
1. Просто предположение. Сообщение об ошибке поступает от функции max(). Из этого я бы сделал вывод, что в fifelse функция max() выполняется для всех групп, даже если условие any(!is.na (x)) является ЛОЖНЫМ, в то время как с ifelse оно выполняется только тогда, когда оно ИСТИННО?
Ответ №1:
Может быть, лучше использовать if/else
, поскольку входные данные равны length
1
df[, if(any(!is.na(x))) max(x, na.rm = TRUE) else NA_real_, by = ID]