2016-06-15 20 views
3

Ich möchte meinen Datenrahmen unterteilen, um nur Gruppen zu behalten, die 3 oder mehr Beobachtungen an VERSCHIEDENEN Tagen haben. Ich möchte Gruppen loswerden, die weniger als 3 Beobachtungen haben, oder die Beobachtungen, die sie haben, sind nicht von 3 verschiedenen Tagen.Entfernen von Gruppen mit weniger als drei eindeutigen Beobachtungen

Hier ist ein Beispieldatensatz:

Group Day 
1  1 
1  3 
1  5 
1  5 
2  2 
2  2 
2  4 
2  4 
3  1 
3  2 
3  3 
4  1 
4  5 

So für das obige Beispiel, Gruppe 1 und Gruppe 3 gehalten werden, und die Gruppe 2 und 4 werden aus dem Datenrahmen entfernt werden.

Ich hoffe, dass dies sinnvoll ist, ich stelle mir vor, die Lösung wird ganz einfach sein, aber ich kann es nicht erarbeiten (ich bin ziemlich neu in R und nicht sehr schnell bei Lösungen zu solchen Dingen). Ich dachte, dass die Diff-Funktion vielleicht nützlich sein könnte, aber nicht viel weiter ging, und ich hatte kein Glück, bestehende Fragen auf SO und anderen Websites nach einer Antwort zu durchsuchen.

Vielen Dank im Voraus!

+0

Versuchen 'df [df $ Group% in% betragen würde as.numeric (Namen (die (tapply (df $ Tag, df $ Gruppe, Funktion (x) Länge (eindeutig (x))> = 3)))),] ' – nicola

Antwort

6

Mit data.table Sie tun können:

library(data.table) 
DT[, if(uniqueN(Day) >= 3) .SD, by = Group] 

die gibt:

Group Day 
1:  1 1 
2:  1 3 
3:  1 5 
4:  1 5 
5:  3 1 
6:  3 2 
7:  3 3 

Oder mit dplyr:

library(dplyr) 
DT %>% 
    group_by(Group) %>% 
    filter(n_distinct(Day) >= 3) 

, die das gleiche Ergebnis liefert.

5

Eine Idee dplyr

library(dplyr) 
df %>% 
    group_by(Group) %>% 
    filter(length(unique(Day)) >= 3) 

#Source: local data frame [7 x 2] 
#Groups: Group [2] 

# Group Day 
# (int) (int) 
#1  1  1 
#2  1  3 
#3  1  5 
#4  1  5 
#5  3  1 
#6  3  2 
#7  3  3 
+2

instea d von 'length (unique (Day))' du könntest 'n_distinct (tag)' – theArun

+0

Nice one! Danke @Arun – Sotos

+0

'n_distinct (Tag)' war bereits in meiner Antwort ...... – Jaap

4

verwenden, können wir base R

i1 <- rowSums(table(df1)!=0)>=3 
subset(df1, Group %in% names(i1)[i1]) 
# Group Day 
#1  1 1 
#2  1 3 
#3  1 5 
#4  1 5 
#9  3 1 
#10  3 2 
#11  3 3 

Oder ein Einzeiler verwenden base R

df1[with(df1, as.logical(ave(Day, Group, FUN = function(x) length(unique(x)) >=3))),]