R / dplyr / комплексный фильтр в функции по строке - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь передать фильтр с несколькими аргументами в виде строки 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 голосов
/ 11 сентября 2018

Исходя из этого ответа, вы просто передаете нормальную строку в функцию 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
0 голосов
/ 11 сентября 2018

Проблема не в том, что вы используете несколько условий.Вы можете видеть, что вы получаете ту же проблему только с одним условием.Проблема в том, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...