2015-01-17 15 views
6

Mam danych w tabeli R, który ma kilka identyfikatorów i wartość. Dla każdej kombinacji identyfikatorów istnieje kilka wierszy. Jeśli jeden z tych wierszy zawiera NA w kolumnie "wartość", chciałbym usunąć wszystkie wiersze z tą kombinacją identyfikatorów. Na przykład w poniższej tabeli chciałbym usunąć wszystkie wiersze, dla których id1 == 2 i id2 == 1.Usuń wiersze z data.table w R na podstawie wartości kilku kolumn

Gdybym miał tylko jeden identyfikator, zrobiłbym dat[!(id1 %in% dat[is.na(value),id1])]. W przykładzie usunąłoby to wszystkie wiersze, gdzie i1 == 2. Jednak nie udało mi się dołączyć kilku kolumn.

dat <- data.table(id1 = c(1,1,2,2,2,2), 
        id2 = c(1,2,1,2,3,1), 
        value = c(5,3,NA,6,7,3)) 
+1

spróbować też DAT [! (ID1 == 2 i ID2 == 1)] 'lub 'setkey (DAT ID1, ID2) [! J (2, 1)] ' – akrun

+0

Wiem, że działałoby to na prostym przykładzie powyżej. Jednak pytanie ma być bardziej ogólne, ponieważ może istnieć duża liczba wierszy z NA. – lilaf

+1

Myślę, że szuka 'dat [, if (all (! Is.na (value))) .SD,. (Id1, id2)]' –

Odpowiedz

4

Jeśli chcesz sprawdzić, na połączeniu z id1 i id2 jeśli wartości są NA s, a następnie usunąć ten cały zestaw można wstawić if oświadczenie na grupę i tylko odzyskać wyników (używając .SD) jeśli to oświadczenie zwróci TRUE.

dat[, if(!anyNA(value)) .SD, by = .(id1, id2)] 
# id1 id2 value 
# 1: 1 1  5 
# 2: 1 2  3 
# 3: 2 2  6 
# 4: 2 3  7 

lub podobnie,

dat[, if(all(!is.na(value))) .SD, by = .(id1, id2)] 
+1

Jeszcze raz dziękuję! – lilaf

+0

To może być kosztowne, aby podzielić 'dat' na wszystkie te .SD' i ułożyć je. Alternatywnym (może ogólnie szybszym?) Podejściem byłoby wybieranie wierszy, aby zachować 'dat [dat [,! Any (is.na (value)), przez =" id1, id2 "] $ V1]' – Frank

+1

@Frank, że nie zadziała. Testowałeś to? –

Powiązane problemy