2013-05-16 27 views
6

Nếu tôi có một dataframe như thế này:Subsetting một dataframe bởi số lượng của sự lặp lại

neu <- data.frame(test1 = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14), 
        test2 = c("a","b","a","b","c","c","a","c","c","d","d","f","f","f")) 
neu 
    test1 test2 
1  1  a 
2  2  b 
3  3  a 
4  4  b 
5  5  c 
6  6  c 
7  7  a 
8  8  c 
9  9  c 
10 10  d 
11 11  d 
12 12  f 
13 13  f 
14 14  f 

và tôi muốn chỉ chọn những giá trị mà mức độ của yếu tố test2 xuất hiện nhiều hơn chúng ta hãy nói ba lần, những gì sẽ là cách nhanh nhất?

Cảm ơn rất nhiều, không thực sự tìm thấy câu trả lời đúng trong các câu hỏi trước.

Trả lời

7

Tìm các hàng sử dụng:

z <- table(neu$test2)[table(neu$test2) >= 3] # repeats greater than or equal to 3 times 

Hoặc:

z <- names(which(table(neu$test2)>=3)) 

Sau đó tập hợp con với:

subset(neu, test2 %in% names(z)) 

Hoặc:

neu[neu$test2 %in% names(z),] 
+0

Thx thực sự đã giúp ích rất nhiều! –

+0

Tại sao nên sử dụng 'as.list'? Tại sao hai 'bảng (.)'? Và tốt hơn là không nên sử dụng 'tập con'. – Arun

+0

Xem các chiến lược thay thế ở trên. – Thomas

3

Tôi muốn sử dụng count từ gói plyr để thực hiện đếm:

library(plyr) 
count_result = count(neu, "test2") 
matching = with(count_result, test2[freq > 3]) 
with(neu, test1[test2 %in% matching]) 
[1] 5 6 8 9 
+0

Awe một số, thx rất nhiều các bạn –

5

Dưới đây là một cách khác:

with(neu, neu[ave(seq(test2), test2, FUN=length) > 3, ]) 

# test1 test2 
# 5  5  c 
# 6  6  c 
# 8  8  c 
# 9  9  c 
+0

+1 này là bởi đến nay là giải pháp cơ bản tốt nhất cho tôi. – Arun

2

The (rộng hơn) data.table cách:

library(data.table) 
dt = data.table(neu) 

dt[dt[, .I[.N >= 3], by = test2]$V1] 

Note : hy vọng, trong tương lai, cú pháp đơn giản sau đây sẽ là cách nhanh chóng để thực hiện điều này:

dt[, .SD[.N >= 3], by = test2] 

(c.f. Subset by group with data.table)

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