2014-07-05 10 views
13

dla następujących danychJak usunąć grupy obserwacji z dplyr :: filtrem()

ds <- read.table(header = TRUE, text =" 
id year attend 
1 2007  1 
1 2008  1 
1 2009  1 
1 2010  1 
1 2011  1 
8 2007  3 
8 2008  NA 
8 2009  3 
8 2010  NA 
8 2011  3 
9 2007  2 
9 2008  3 
9 2009  3 
9 2010  5 
9 2011  5 
10 2007  4 
10 2008  4 
10 2009  2 
10 2010 NA 
10 2011 NA 
") 
ds<- ds %>% dplyr::mutate(time=year-2000) 
print(ds) 

Jak napisać polecenie dplyr :: filtr(), aby zachować tylko identyfikatory, które nie mają pojedynczy NA? Tak więc tylko osoby z identyfikatorami 1 i 9 powinny pozostać za filtrem.

+0

To znaczy, 1 i 9? –

Odpowiedz

7

Zastosowanie filter w połączeniu z base::ave

ds %>% dplyr::filter(ave(!is.na(attend), id, FUN = all)) 

Aby uzyskać

id year attend 
1 1 2007  1 
2 1 2008  1 
3 1 2009  1 
4 1 2010  1 
5 1 2011  1 
6 9 2007  2 
7 9 2008  3 
8 9 2009  3 
9 9 2010  5 
10 9 2011  5 
+0

tak, 1 i 9, już to poprawiłem. Dzięki, @Robert Krzyzanowski, dokładnie tego potrzebowałem. Nigdy wcześniej nie widziałem funkcji ave(), cieszę się, że zapytałem, nauczyłem się czegoś nowego. – andrey

+0

Dzięki! Nie zapomnij o przegłosowaniu. :) –

+0

Czekałem 2 min, aby przejść, aby go zaakceptować :) jeszcze raz dziękuję! – andrey

28

lub można użyć:

ds %>% 
group_by(id) %>% 
filter(attend=all(!is.na(attend))) 
#Source: local data frame [10 x 3] 
#Groups: id 

# id year attend 
#1 1 2007  1 
#2 1 2008  1 
#3 1 2009  1 
#4 1 2010  1 
#5 1 2011  1 
#6 9 2007  2 
#7 9 2008  3 
#8 9 2009  3 
#9 9 2010  5 
#10 9 2011  5 
+0

Podoba mi się ten jeden lepiej, ponieważ pozostaje w dplyr i jest krótszy. Dzięki! – andrey

+8

'suma (is.na (obecność)) == 0' również będzie działać – hadley

+0

Dzięki @hadley za komentarz. – akrun

Powiązane problemy