2013-05-16 8 views
6

Jeśli mam dataframe takiego:podzbiorów do dataframe przez ilość powtórzeń

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 

i chciałbym wybrać tylko te wartości, w której poziom czynnika test2 pojawia się więcej niż powiedzmy trzy razy, jaki byłby najszybszy sposób?

Dziękuję bardzo, tak naprawdę nie znalazłem właściwej odpowiedzi w poprzednich pytaniach.

Odpowiedz

7

Znajdź wierszy przy użyciu:

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

czyli

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

Następnie podzbiór z:

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

Lub:

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

Thx, które naprawdę bardzo pomogły! –

+0

Dlaczego używać 'as.list'? Dlaczego dwie 'table (.)'? I lepiej nie używać 'podzbioru'. – Arun

+0

Zobacz alternatywne strategie powyżej. – Thomas

3

użyję count z pakietu plyr wykonać liczenia:

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 niektórzy, thx, bardzo dużo, –

5

Oto kolejny sposób:

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 to zdecydowanie najlepsze rozwiązanie bazowe dla mnie. – Arun

2

The (lepsze skalowanie) data.table sposób:

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

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

Uwaga : miejmy nadzieję, że w przyszłości następująca prostsza składnia będzie szybkim sposobem:

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

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

Powiązane problemy