Иногда мне нужно подсчитать количество элементов не 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
?