在编程中使用dplyr filter()

Kay*_*Kay 5 r dplyr tidyverse rlang

我正在编写我的函数,并希望使用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()
Run Code Online (Sandbox Code Playgroud)

无论何时我运行此函数,它看起来filter都不会选择满足条件的任何行.

我怎样才能做到这一点?

更新

出于某种原因,当我不使用`%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()
Run Code Online (Sandbox Code Playgroud)

但是,每个循环的结果都是相同的.为什么会这样?而且为什么我不能使用%in%.

dmi*_*kno 8

我同意@ hrbrmstr的标准评估解决方案.正如@hadley 今天在这里提出的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)))
Run Code Online (Sandbox Code Playgroud)


hrb*_*str 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))
Run Code Online (Sandbox Code Playgroud)

尽管有大量的"官方""tidyverse"示例使用df,但它是statspkg中的一个函数,我试图避免再使用它.

由于您使用的tidyverse,还不如趁map_df()purrr.

  • @dpprdan`df`返回F分布的密度,来自stats包.我同意@hrbrmstr,我也停止使用`df`进行命名 (3认同)