2014-07-05 14 views
13

Per i seguenti datiCome rimuovere gruppi di osservazione con dplyr :: filtro()

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) 

Come dovrei scrivere un comando dplyr :: filtro() per mantenere solo gli ID che non hanno un single NA? Quindi, solo i soggetti con ID 1 e 9 dovrebbero rimanere dopo il filtro.

+0

Intendi 1 e 9? –

risposta

7

Usa filter in combinazione con base::ave

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

Per ottenere

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

sì, 1 e 9, l'ho già corretto. Grazie, @Robert Krzyzanowski, questo è esattamente ciò di cui avevo bisogno. Non ho mai visto la funzione ave() usata prima, sono contento di averlo chiesto, ho imparato qualcosa di nuovo. – andrey

+0

Grazie! Non dimenticare di upvotare. :) –

+0

Stavo aspettando 2 minuti per accettarlo :) grazie ancora! – andrey

28

Oppure si potrebbe usare:

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

Mi piace di più questo, perché rimane all'interno di dplyr ed è più corto. Grazie! – andrey

+8

'sum (is.na (attend)) == 0' funzionerebbe anche – hadley

+0

Grazie @hadley per il commento. – akrun