2014-07-05 15 views
13

Đối với các dữ liệu sauLàm thế nào để loại bỏ các nhóm quan sát với dplyr :: lọc()

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) 

Làm thế nào tôi sẽ viết một lệnh dplyr :: lọc() để giữ chỉ id mà không có một đơn NA? Vì vậy, chỉ những đối tượng có id 1 và 9 mới nên ở lại sau bộ lọc.

+0

Bạn có nghĩa là 1 và 9? –

Trả lời

7

Sử dụng filter kết hợp với base::ave

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

Để có được

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

có, 1 và 9, tôi đã sửa chữa nó. Cảm ơn, @Robert Krzyzanowski, đây chính xác là những gì tôi cần. Tôi chưa bao giờ thấy hàm ave() được sử dụng trước đây, tôi vui vì tôi đã hỏi, đã học được điều gì đó mới mẻ. – andrey

+0

Cảm ơn! Đừng quên upvote. :) –

+0

Tôi đã chờ 2 phút để vượt qua để chấp nhận nó :) cảm ơn một lần nữa! – andrey

28

Hoặc bạn có thể sử dụng:

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

Tôi thích cái này tốt hơn, bởi vì nó nằm trong dplyr và ngắn hơn. Cảm ơn! – andrey

+8

'tổng (is.na (tham dự)) == 0' cũng sẽ hoạt động – hadley

+0

Cảm ơn @hadley đã bình luận. – akrun

Các vấn đề liên quan