2017-12-03 1 views
0

Lassen Sie mich ein Beispiel von dem, was ich versuche, zu tun, da der Titel möglicherweise nicht so klar, wie ich es gerne wäre. Dies muss nicht reproduzierbaren Code, aber ich kann ein reproduzierbares Beispiel hinzufügen, wenn das helfen wird:Verwenden Sie Filter in dplyr bedingt durch eine if-Anweisung in R

library(dplyr) 
if(this_team != "") { 
    newdf <- mydf %>%  
     filter(team == this_team) %>% 
     mutate(totalrows = nrow(.)) %>% 
     group_by(x1, y1) %>% 
     summarize(dosomestuff) 
} else { 
    newdf <- mydf %>%  
     filter(firstname == this_name & lastname == that_name) %>% 
     mutate(totalrows = nrow(.)) %>% 
     group_by(x1, y1) %>% 
     summarize(dosomestuff) 
} 

ich eine Funktion in R erschaffe, die einige Datenmanipulationen auf dem mydf Datenrahmen tut. Wenn ich einen Wert an den Parameter team_name der Funktion übergebe, möchte ich den Datenrahmen anhand der Spalte 'team' filtern. Wenn ich keinen Wert an den Parameter team_name übergebe, wird standardmäßig "" verwendet. Stattdessen übergebe ich Werte für this_name und that_name, die den Spalten 'firstname' und 'lastname' in mydf entsprechen.

Gibt es eine bessere Möglichkeit, dies zu tun, anstatt die gesamte dplyr-Pipeline in zwei separaten if else-Anweisungen erneut erstellen zu müssen? Meine eigentliche Pipeline von Code ist viel länger als 4 Zeilen, so Code so zu reproduzieren ist ziemlich frustrierend.

Antwort

1

Sie könnten tun

library(dplyr) 
y <- "" 
data.frame(x = 1:5) %>% 
    {if (y=="") filter(., x>3) else filter(., x<3)} %>% 
    tail(1) 

oder

data.frame(x = 1:5) %>% 
filter(if (y=="") x>3 else x<3) %>% 
    tail(1) 

oder sogar die Pfeife speichern in den Adern

mypipe <- . %>% tail(1) %>% print 
data.frame(x = 1:5) %>% mypipe 
+0

nur knapp sein Ziel klar, dass es so einfach war, wie ich i einfache Drop dachte könnte nicht eine if() Aussage mitten in der Rohrleitung. Vielen Dank! – Canovice