2017-07-21 38 views
5

我在寫我的函數,並希望使用dplyr的filter()函數來選擇滿足條件的數據框的行。這是我的代碼:在編程中使用dplyr filter()

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

每當我運行這個功能,它看起來像filter不會選擇滿足條件的任何行。

我該如何做這項工作?

更新

出於某種原因,這個工程時,我不%的人使用'%,如;

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

但是,每個循環的結果都是一樣的。這是爲什麼?也爲什麼我不能使用%in%

+0

看一看'filter_' – HubertL

+0

@HubertL,YH我知道這一點,也filter_是越來越淘汰 – Kay

+0

你讀過這在哪裏? – HubertL

回答

7

這似乎做你想做的(但它由你需要確認):

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

儘管學生的「官」,「tidyverse」使用df例子多如牛毛,它在stats PKG功能我儘量避免再使用它。

由於您使用的是Tidyverse,不妨利用從purrr

+0

我不明白「過多的」官方「」tidyverse「使用'df'的例子,它是'stats' pkg中的一個函數。我沒有看到任何「統計」功能。我猜你的意思是'base :: lapply'? – dpprdan

+3

@dpprdan'df'返回F分佈的密度並來自stats包。我同意@hrbrmstr,並且我也停止使用'df'命名 – aurelien

+1

如果用基本函數'as.name()'替換'rlang :: sym()',則可以不加載'library(rlang) – dmi3kno

8

我同意@ hrbrmstr的標準評估解決方案。作爲建議的@hadley today這裏的NSE解決方案:

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