R,使用 dplyr::filter() 和 %in% 将列名作为参数传递给函数

R, pass column name as argument to function using dplyr::filter() and %in%

如何在与问题 here 类似但使用 dplyr 链接和 filter() 以及 %in%.[=19= 的函数中传递列名]

require(dplyr)
set.seed(8)
df <- data.frame(
  A=sample(c(1:3), 10, replace=T), 
  B=sample(c(1:3), 10, replace=T))

如果想获取 A 列为 1 或 2 的行,我可以这样做:

df %>% filter(A %in% c(1,2))

我得到:

  A B
1 2 3
2 1 2
3 1 3
4 2 1
5 1 1
6 1 3

现在,我怎样才能把它放在一个函数中,在那里可以指定列,这是行不通的:

fun1 <- function(x, column, n){
  res <- 
    x %>% filter(column %in% n)
  return(res)
}
fun1(df, A, c(1,2))

你可以试试

fun1 <- function(x, column, n){
 x %>% 
  filter_(lazyeval::interp(quote(x %in% y), x=as.name(column), y=n))
 }
fun1(df, 'A', 1:2)

或者

fun2 <- function(x, column, n){
   args <- as.list(match.call())
   x %>%
     filter(eval(args$column, x) %in% n)
 }

 fun2(df, A, 1:2)

如果你想保留你的功能,试试:

fun1 <- function(x, column, n){
  res <- x %>% filter_(paste(column,"%in%",n))
  return(res)
}

fun1(df, "A", "c(1,2)")

尝试将函数更改为

fun1 <- function(x, column, n){
    require(lazyeval)
    filter_(x,
        interp(quote(col %in% n),
            col = lazy(column), n = n))
}

all(fun1(df, A, c(1, 2)) == filter(df, A %in% c(1,2)))
# TRUE