R / dplyr /字符串中的复数过滤器

时间:2018-09-11 14:37:34

标签: r string filter dplyr

我正在尝试将具有多个参数的过滤器作为字符串传递给函数中的dplyr :: filter。到目前为止,我所看到的答案都与单个过滤器参数有关,而不是多个过滤器参数。

示例:

myfil <- function(df, fil) {
    quo_fil <- enquo(fil)
    df <- filter(df, !! quo_fil)
    df 
}

set.seed(25)
df <- data.frame(a = sample(10, 10), b = sample(10, 10), c = sample(10, 10))

#works
filter(df, a > 3 & b > 2 & c < 8)

  a  b c
1 5  4 1
2 7 10 5
3 9  5 2
4 6  6 3

# does not work
f <- "a > 3 & b > 2 & c < 8"

myfil(df, f)

2 个答案:

答案 0 :(得分:2)

基于this的答案,您只需将普通字符串传递给filter_函数即可,并且效果很好。

myfil <- function(df, fil) {
   df <- filter_(df, fil)
   df   
}

我的结果:

> myfil(df, 'a > 3 & b > 2 & c < 8')
  a b c
1 8 9 7

答案 1 :(得分:1)

问题不在于您正在使用多个条件。您可以看到只有一个条件就会遇到相同的问题。问题是enquo需要一个裸表达式,而不是字符串。因此,这将返回预期结果:

myfil(df, a > 3 & b > 2 & c < 8)

  a  b c
1 5  4 1
2 7 10 5
3 9  5 2
4 6  6 3

如果要使用字符串,可以使用rlang::parse_expr将字符串转换成表达式,以使!!可以使用:

myfil <- function(df, fil) {
  quo_fil <- rlang::parse_expr(fil)
  filter(df, !!quo_fil)
}

f <- "a > 3 & b > 2 & c < 8"
myfil(df, f)

  a  b c
1 5  4 1
2 7 10 5
3 9  5 2
4 6  6 3