【问题标题】:R / dplyr / complex filter in function by stringR/dplyr/complex filter in function by string
【发布时间】:2019-02-16 02:32:25
【问题描述】:

我正在尝试将具有多个参数的过滤器作为字符串移交给函数内的 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)

【问题讨论】:

  • 不知道如何解决这个问题,但如果我们能找到一种不将信息存储在字符串中的方法,也许有一种解决方法?字符串是如何生成的?

标签: r string filter dplyr


【解决方案1】:

基于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

【讨论】:

  • facepalm - 太明显了!谢谢!
【解决方案2】:

问题不在于您使用多个条件这一事实。您可以看到只有一个条件会遇到相同的问题。问题是 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

【讨论】:

  • 感谢您消除困惑,我怀疑我(取消)引用的方式有问题...
猜你喜欢
  • 2022-12-02
  • 1970-01-01
  • 2014-11-26
  • 2016-04-01
  • 2022-12-02
  • 2022-12-02
  • 2022-02-24
  • 2015-04-04
  • 1970-01-01
相关资源
最近更新 更多