2017-11-22 107 views
5

Chciałbym użyć data.table ale chciałby pominąć obliczenia j części, jeżeli by odpowiada brakuje (NA):Pomiń NA w data.table przez

Oto przykład data.table

library(data.table) 
DT <- data.table(y=10, g=c(1,1,1,2,2,2,2,2,NA,NA)) 

wygląda to

> DT 
    y g 
1: 10 1 
2: 10 1 
3: 10 1 
4: 10 2 
5: 10 2 
6: 10 2 
7: 10 2 
8: 10 2 
9: 10 NA 
10: 10 NA 

teraz chciałbym zrobić by= na g i dwa wiersze 9 i 10 zostaną zgrupowane razem, ponieważ mają tę samą wartość NA.

> DT[,.N, by=g] 
    g N 
1: 1 3 
2: 2 5 
3: NA 2 

Chciałbym zachować linię NA na wyjściu, ale chciałby, aby pominąć część Obliczyć wynik, tzn., Uzyskać wyjście, gdzie N jest pusta, kiedy g jest NA

> DT[,.N, by=g] 
    g N 
1: 1 3 
2: 2 5 
3: NA NA 

Myślałem, że mogę uzyskać dostęp do wartości g przez .GRP, ale to tylko daje indeks grupy, a nie wartość. Czy możliwe jest uzależnienie obliczeń od brakującego statusu zmiennej by?

+3

Wartość _ Twojej zmiennej grupującej _can_ jest dostępna w 'j' - ma długość jeden, jeśli jest używana w' j' (patrz [FAQ 2.10 Wewnątrz każdej grupy, dlaczego zmienne grupy mają długość-1?] (Https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-faq.html#inside-each-group-why-are-the-group-variables-length-1) Więc coś jak 'DT [, if (! is.na (g)). (n = .N) else NA_integer_, by = g] 'zadziałałoby – Henrik

+3

Co jest nie tak z filtrowaniem przez'! is.na (g) 'w argumencie' i'? 'DT [! Is.na (g), N, przez = g]' –

+0

@ScottRitchie Myślę, że to usunęłoby linię 'NA' z wyniku. Nadal chcę tego dla następnego łączenia. – ekstroem

Odpowiedz

4

Możesz spróbować tego:

DT[, .N * NA^is.na(g), by = g] 
g V1 
1: 1 3 
2: 2 5 
3: NA NA 

Jest algebraiczne wersja Henrik'sif ... else ... klauzuli. Wykorzystuje fakt, że NA^0 powraca 1 podczas gdy NA^1 zwraca NA i że FALSE i TRUE może być zmuszany do 0 i 1, wzgl.

Jeśli chcesz kontrolować nazwę kolumna:

DT[, .(n = .N * NA^is.na(g)), by = g] 
g n 
1: 1 3 
2: 2 5 
3: NA NA 

Ewentualnie, jeśli powyższe wydaje się trudne, można odwołać się do data.table łańcuchowych (dzięki Sotos do wniesienia tę górę):

DT[, .N, by = g][is.na(g), N := NA][] 

Spowoduje to zmianę wartości N po agregacji na.