Иногда мне нужно подсчитать количество элементов не NA в том или ином столбце в моем data.table. Каков наилучший способ data.table -tailored сделать это?
Для конкретности, позвольте работать с этим:
DT <- data.table(id = sample(100, size = 1e6, replace = TRUE),
var = sample(c(1, 0, NA), size = 1e6, replace = TRUE), key = "id")
Первое, что приходит мне на ум, работает следующим образом:
DT[!is.na(var), N := .N, by = id]
Но у этого есть неудачный недостаток, который N не присваивается ни одной строке, где var отсутствует, т.е. DT[is.na(var), N] = NA.
Поэтому я работаю над этим, добавив:
DT[!is.na(var), N:= .N, by = id][ , N := max(N, na.rm = TRUE), by = id] #OPTION 1
Однако я не уверен, что это лучший подход; другой вариант, о котором я подумал, и один из предложенных аналогом этого вопроса для data.frame:
DT[ , N := length(var[!is.na(var)]), by = id] # OPTION 2
и
DT[ , N := sum(!is.na(var)), by = id] # OPTION 3
Сравнивая время их вычисления (в среднем более 100 испытаний), последнее кажется самым быстрым:
OPTION 1 | OPTION 2 | OPTION 3
.075 | .065 | .043
Кто-нибудь знает более быстрый способ для data.table?