2016-07-03 5 views
1

Ich habe die unten, help.a und ich muss dies mit mehreren Filter-Operationen zu reinigen.Mehrere Filter Operationen über dplyr basierend auf Anzahl und Art der Beobachtungen in separaten Spalten

help.a <- data.frame(id = as.factor(c("01", "01", "01", "01", "01", "04", "04", "05", "05", "05", "05", "05", "09", "09", "09", "09", "09")), 
        episode = c(3, 3, 3, 4, 4, 3, 3, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1), 
        count = c(1, 2, 3, 4, 5, 1, 2, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5), 
        var_a = c(73, 73, 73, 73, 73, 43, 43, 80, 80, 80, 80, 80, 73, 73, 73, 73, 42)) 


id episode count var_a 
01  3  1 73 
01  3  2 73 
01  3  3 73 
01  4  4 73 
01  4  5 73 
04  3  1 43 
04  3  2 43 
05  2  1 80 
05  2  2 80 
05  2  3 80 
05  2  4 80 
05  3  5 80 
09  1  1 73 
09  1  2 73 
09  1  3 73 
09  1  4 73 
09  1  5 42 

Erstens: ich mit einer Zählung alle IDs zu entfernen versuche, weniger als 3 (zB id 4)

Zweitens: Ich möchte entfernen Beobachtungen mit mehreren Episoden während halten die erste beobachtete Episode (die niedrigste beobachtete Episodennummer)

Drittens: Ich möchte nur ID-Beobachtungen mit der gleichenbehaltenVariable ... Wenn es mehr var_a Beobachtungen mag ich nur das erste beobachtet Variable halten (zB ID 9 und Var_a 73)

Am Ende hoffe ich meine Daten-Set unten werden wie folgt aussehen:

id episode count var_a 
01  3  1 73 
01  3  2 73 
01  3  3 73 
05  2  1 80 
05  2  2 80 
05  2  3 80 
05  2  4 80 
09  1  1 73 
09  1  2 73 
09  1  3 73 
09  1  4 73 

Meine Versuche bisher erreicht hat, Teil 1 mit dem folgenden Code:

help.a %>% group_by(id) %>% filter(!n() <3) 

Doch ich steckte mit wie dplyr zu sagen, beobachtet zu halten ersten episode und beobachtete ersten var.a ... Irgendwelche Vorschläge einen sehr geschätzt.

Antwort

1

Wir können alle drei Bedingungen in einem einzigen filter nach dem Gruppieren von 'id'

help.a %>% 
    group_by(id) %>% filter(n() >3 & 
          episode == first(episode) & 
          var_a == first(var_a))  
#  id episode count var_a 
# <fctr> <dbl> <dbl> <dbl> 
#1  01  3  1 73 
#2  01  3  2 73 
#3  01  3  3 73 
#4  05  2  1 80 
#5  05  2  2 80 
#6  05  2  3 80 
#7  05  2  4 80 
#8  09  1  1 73 
#9  09  1  2 73 
#10  09  1  3 73 
#11  09  1  4 73 
+0

Brilliant verwenden! Ok, nur damit ich das bekomme ... (1) Wir können '&' nach dem Filter verwenden, um einen weiteren Filterausdruck hinzuzufügen ... Wir verwenden das anstelle von | oder Befehl, weil wir wollen, dass sie in der richtigen Reihenfolge ablaufen. (2) Der Aufruf von "episode == unique (episode) [1]" ruft nach der ersten eindeutigen Episode, und der Index von [1] sagt das. Und (3) Das gleiche für var_a unter erneuter Verwendung des Index von [1]. Klingt das richtig? – bpace

+1

@bpace Ich habe die 'unique (episode) [1]' in 'first (episode)' geändert, um die Dinge schneller zu machen. Wir verwenden das '&', so dass nur Zeilen gefiltert werden, die alle diese Bedingungen erfüllen. – akrun

+0

Ah, es sieht so aus, als hätten Sie es in zuerst geändert() ... Das macht Sinn. Und das muss genauso sein wie die Indizierung mit [1], richtig? – bpace

Verwandte Themen