Czasami muszę policzyć liczbę elementów innych niż NA
w jednej lub drugiej kolumnie w moim data.table
. Jaki jest najlepszy sposób na zrobienie tego?Efektywne liczenie elementów innych niż NA w data.table
Dla konkretności, niech pracują z tym:
DT <- data.table(id = sample(100, size = 1e6, replace = TRUE),
var = sample(c(1, 0, NA), size = 1e6, replace = TRUE), key = "id")
Pierwszą rzeczą, która przychodzi mi do głowy, działa tak:
DT[!is.na(var), N := .N, by = id]
Ale to ma niestety wadę, że N
nie zostanie przypisany do dowolnego wiersza, w którym brakuje var
, tj. DT[is.na(var), N] = NA
.
Więc to obejść poprzez dołączenie:
DT[!is.na(var), N:= .N, by = id][ , N := max(N, na.rm = TRUE), by = id] #OPTION 1
Jednak nie jestem pewien, że to jest najlepsze podejście; Inną opcją myślałem i jeden z sugestią analogowej na this pytanie do data.frame
s byłoby:
DT[ , N := length(var[!is.na(var)]), by = id] # OPTION 2
i
DT[ , N := sum(!is.na(var)), by = id] # OPTION 3
Porównując czas obliczeń z nich (średnio ponad 100 prób), ostatni wydaje aby być najszybszym:
OPTION 1 | OPTION 2 | OPTION 3
.075 | .065 | .043
Czy ktoś wie szybszą drogę do data.table
?
@MichaelChirico, spojrzeć w [Klawisze i binarnych podzbiorów wyszukiwania opartych] (https://github.com/Rdatatable/data.table/wiki/Getting-started) (i niech nas wie, jeśli znajdziesz coś niejasnego/do dodania [tutaj] (https://github.com/Rdatatable/data.table/issues/944). – Arun
Istnieje jeszcze jedna opcja: 'dt5 [,. N [! is. na (var)], by = id] '- trzeci najszybszy w moim systemie i znacznie lepszy niż opcje 1 i 2. Z jakiegoś powodu opcja 3 daje odpowiedzi binarne (0,1) zamiast zliczeń, jeśli więcej niż jeden" przez Używana jest zmienna. Sugerowana opcja 5 daje prawidłowe wartości. –