2015-06-24 18 views
6

mit Nehmen Sie ein einfaches Daten-SetGruppe durch und Filterdatenmanagement dplyr

a <- c(1,2,3,4,5,6,7,8) 
b <- c(1,2,2,1,2,2,2,2) 
c <- c(1,1,1,2,2,2,3,3) 
d <- data.frame(a,b,c) 

jetzt will ich meine Daten filtern, so dass wir group_by(c) und dann alle Daten entfernen, wo kein b=1 auftritt.

So sind die Ergebnisse (e) sollte wie d aussehen, aber ohne die beiden unteren Reihen

ich versucht habe

e <- d %>% 
    group_by(c) %>% 
    filter(n(b)>1) 

unter Verwendung der Ausgabe der Daten in grün unten enthalten soll und die Daten in rot entfernen

enter image description here

+2

'e <- d %>% group_by (c)%>% Filter (b ergibt = = 1) ' – SabDeM

+2

'! B == 1' ist gleich 'b! = 1' was ist vielleicht ein wenig lesbarer? –

+0

nicht genau, so dass ich jede eindeutige'c' Zeile entfernen möchte, wo jede'c' Identität kein'b == 1' – lukeg

Antwort

10

Versuchen

d %>% 
    group_by(c) %>% 
    filter(any(b == 1)) 

Welche gibt:

#Source: local data frame [6 x 3] 
#Groups: c 
# 
# a b c 
#1 1 1 1 
#2 2 2 1 
#3 3 2 1 
#4 4 1 2 
#5 5 2 2 
#6 6 2 2 
+0

Großartig. Danke, was ist die'any'-Funktion. es ist nicht dokumentiert in http://cran.r-project.org/web/packages/dplyr/dplyr.pdf – lukeg

+2

@lukeg Dies ist nicht Teil des 'dplyr' Pakets. 'any()' ist in der Basis R. Von '? any': * Gibt es eine Menge von logischen Vektoren, ist mindestens einer der Werte wahr? * –

0

Sie können versuchen,

df <- d %>% mutate(test = ifelse((b != 1) == T, 0, 1)) %>% group_by(c) %>% 
      mutate(test = sum(test)) %>% filter(test != 0) %>% select(-test) 

die

# a b c 
#1 1 1 1 
#2 2 2 1 
#3 3 2 1 
#4 4 1 2 
#5 5 2 2 
#6 6 2 2 
+3

Das scheint übermäßig verschachtelt. Warum verketten Sie nicht alle Ihre Operationen? Warum erstellen Sie einige Variablen mit 'muate()' und einige mit '$'? Warum enden Sie mit 'ungroup()'? –

+0

@ Steven Beaupre, danke. Die Bearbeitung kettet die Ops –

Verwandte Themen