Разделение таблицы data.table с помощью оператора: функции, возвращающие числовые значения и / или NA fail

У меня есть data.table с двумя столбцами: один столбец ID и один столбец value . Я хочу разбить таблицу по столбцу ID и запустить функцию foo в столбце значение .Это прекрасно работает, пока foo не возвращает NA. В этом случае я получаю сообщение об ошибке, которое говорит мне, что типы групп не согласованы. Я предполагаю, что - поскольку is.logical (NA) равно TRUE , а is.numeric (NA) равно FALSE , ] data.table внутренне предполагает, что я хочу объединить логические значения с числовыми, и возвращает ошибку. Однако мне такое поведение кажется странным. Есть комментарии по этому поводу? Пропускаю ли я здесь что-то очевидное или это действительно запланированное поведение? Если так, было бы здорово дать краткое объяснение. (Обратите внимание, что я знаю обходной путь: просто позвольте foo2 вернуть полное невероятное число и отфильтруйте его позже. Однако это кажется плохим кодированием).

Вот пример:

library(data.table)
foo1 <- function(x) {if (mean(x) < 5) {return(1)} else {return(2)}}
foo2 <- function(x) {if (mean(x) < 5) {return(1)} else {return(NA)}}
DT <- data.table(ID=rep(c("A", "B"), each=5), value=1:10)
DT[, foo1(value), by=ID] #Works perfectly
     ID V1
[1,]  A  1
[2,]  B  2
DT[, foo2(value), by=ID] #Throws error
Error in `[.data.table`(DT, , foo2(value), by = ID) : 
columns of j don't evaluate to consistent types for each group: result for group 2 has column 1 type 'logical' but expecting type 'numeric'
11
задан Christoph_J 31 October 2011 в 23:01
поделиться