2017-07-21 4 views
5

Ich schreibe meine Funktion und möchte dplyrs filter() - Funktion verwenden, um Zeilen meines Datenrahmens auszuwählen, die eine Bedingung erfüllen. Dies ist mein Code:Verwendung von dplyr filter() in Programmierung

library(tidyverse) 

df <-data.frame(x = sample(1:100, 50), y = rnorm(50), z = sample(1:100,50), w = sample(1:100, 50), 
      p = sample(1:100,50)) 

new <- function(ang,brad,drau){ 
    df%>%filter(!!drau %in% 1:50)%>%select(ang,brad) -> A 
return(A) 
} 

brand <- c("z","w","p") 
lapply(1:3, function(i) new(ang = "x", brad = "y", drau = brand[i]))%>%bind_rows() 

Immer wenn ich diese Funktion zu starten, ist es wie filter sieht wählen keine Zeilen, die die Bedingung erfüllen.

Wie kann ich das schaffen?

aktualisieren

Aus irgendeinem Grund funktioniert das, wenn ich in% verwenden `% nicht, wie in;

new <- function(ang,brad,drau){ 
    df%>%filter(!!drau > 50)%>%select(ang,brad) -> A 
return(A) 
} 

lapply(1:3, function(i) new(ang = "x", brad = "y", drau = brand[i]))%>%bind_rows() 

Die Ergebnisse sind jedoch für jede Schleife gleich. Warum ist das so? und auch warum kann ich nicht %in% verwenden.

+0

einen Blick auf 'filter_' – HubertL

+0

@HubertL haben, Yh Ich weiß, dass und auch – Kay

+0

filter_ wird immer auslaufen, wo Sie diese gelesen haben? – HubertL

Antwort

7

Dies scheint zu tun, was Sie wollen (aber es braucht eine Bestätigung von Ihnen):

library(tidyverse) 
library(rlang) 

set.seed(1492) 

xdf <- data_frame(
    x = sample(1:100, 50), 
    y = rnorm(50), 
    z = sample(1:100,50), 
    w = sample(1:100, 50), 
    p = sample(1:100,50) 
) 

new_df <- function(ang, brad, drau) { 
    drau <- sym(drau) 
    filter(xdf, UQE(drau) %in% 1:50) %>% 
    select(ang, brad) 
} 

brand <- c("z", "w", "p") 

map_df(brand, ~new_df(ang = "x", brad = "y", drau = .x)) 

Trotz einer Fülle von „offiziellen“ „tidyverse“ Beispiele dort mit df zu sein, ist es eine Funktion in der stats pkg ist und ich versuche, es nicht mehr zu benutzen.

Da Sie den Tidyverse verwenden, können Sie auch map_df() von purrr nutzen.

+0

Ich verstehe nicht "Fülle von" offiziellen "" Tidyverse "Beispiele mit' df', es ist eine Funktion in der 'stats' pkg". Ich sehe keine "Statistik" -Funktion. Ich nehme an, du meintest "base :: lapply"? – dpprdan

+3

@dpprdan 'df' gibt die Dichte der F-Verteilung zurück und kommt aus dem Statistikpaket. Ich stimme @hrbrmstr zu und ich hörte auch auf 'df' für die Benennung – aurelien

+1

Sie können wegkommen, ohne' library (rlang) 'zu laden, wenn Sie' rlang :: sym() 'durch die Basisfunktion' as.name() 'ersetzen – dmi3kno

8

Ich stimme der Standard-Bewertungslösung von @ hrbrmstr zu. Wie von @hadley vorgeschlagen today hier NSE Lösung:

library(tidyverse) 

df <-data.frame(x = sample(1:100, 50), 
       y = rnorm(50), 
       z = sample(1:100,50), 
       w = sample(1:100, 50), 
       p = sample(1:100,50)) 

new <- function(ang, brad, drau){ 
    ang <- enquo(ang) 
    brad <- enquo(brad) 
    drau <- enquo(drau) 

    df %>% filter(UQ(drau) %in% 1:50) %>% 
    select(UQ(ang),UQ(brad)) 
} 

brand <- c("z","w","p") 
brand <- rlang::syms(brand) 

map_df(brand, ~new(ang = x, brad = y, drau = UQ(.x))) 
Verwandte Themen