2017-07-21 58 views
5

Piszę swoją funkcję i chcę użyć funkcji filter() dplyr, aby wybrać wiersze z mojej ramki danych, które spełniają warunek. To jest mój kod:Używanie filtra dplyr() w programowaniu

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() 

Anytime uruchomić tę funkcję, to wygląda filter nie wybrano żadnych wierszy, które spełniają warunek.

Jak mogę to ułatwić?

Aktualizacja

Z jakiegoś powodu, to działa, gdy nie używam `% w%, podobnie jak w;

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() 

Wyniki są jednak takie same dla każdej pętli. Dlaczego tak jest? i dlaczego nie mogę używać %in%.

+0

Wystarczy popatrzeć na 'filter_' – HubertL

+0

@HubertL, Yh wiem, że i również filter_ jest uzyskiwanie wycofywane – Kay

+0

gdzie ty czytasz? – HubertL

Odpowiedz

7

To wydaje się robić to, co chcesz (ale to wymaga potwierdzenia przez użytkownika):

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)) 

Pomimo istnienia mnóstwo „oficjalnych” „tidyverse” przykładów wykorzystujących df, to funkcja w stats pkg i staram się już go unikać.

Ponieważ używasz tidyverse, możesz równie dobrze skorzystać z map_df() z purrr.

+0

Nie rozumiem "obfitych" oficjalnych "" tidyverse "przykładów przy użyciu' df', jest to funkcja w 'stats' pkg". Nie widzę żadnej funkcji "statystyki". Chyba miałeś na myśli 'base :: lapply'? – dpprdan

+3

@dpprdan 'df' zwraca gęstość dystrybucji F i pochodzi z pakietu statystyk. Zgadzam się z @hrbrmstr i również przestałem używać 'df' do nazywania – aurelien

+1

Możesz uciec bez ładowania' biblioteki (rlang) 'jeśli zastąpisz' rlang :: sym() 'z funkcją podstawową' as.name() ' – dmi3kno

8

Zgadzam się ze standardowym rozwiązaniem oceny @ hrbrmstr. Jak sugeruje @hadley today oto NSE rozwiązanie:

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)))