Могу ли я подставить условия в фильтр dplyr? - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь передать условное (<,>, et c) и значение в функцию, которая будет оцениваться в фильтре dplyr.

Другие ответы на SO предполагают, что я должен просто иметь возможность использовать синтаксический анализ, но моя примерная функция (без использования аргументов) не работает с:

Error in (...) & ~parse(text = "obj_200 > 0") : operations are possible only for numeric, logical or complex types

Пример функции:

filterOrder = function( df, cond, value) {
  df = df %>% 
    rownames_to_column('date') %>%
    filter( ...
            parse(text="obj_200 > 0"),                       
            ...                    
          ) 
  ...
  
  return(df)
}

Ответы [ 2 ]

1 голос
/ 12 июля 2020

, если вы хотите избавиться от строковых условий, вы можете сделать что-то вроде этого

library(magrittr)

df <- dplyr::tibble(A=1:10,
                    B=11:20,
                    C=10:1)

foo <- function(df, .cond){
  .cond <- rlang::enquo(.cond)      
  res <- df %>%
    dplyr::filter(!!.cond)      
  return(res)
}

foo(df,.cond=A>5)

# A tibble: 5 x 3
      A     B     C
  <int> <int> <int>
1     6    16     5
2     7    17     4
3     8    18     3
4     9    19     2
5    10    20     1

foo(df,.cond=A==1)

# A tibble: 1 x 3
      A     B     C
  <int> <int> <int>
1     1    11    10

foo(df,.cond=A>3 & C<4)

# A tibble: 3 x 3
      A     B     C
  <int> <int> <int>
1     8    18     3
2     9    19     2
3    10    20     1
1 голос
/ 12 июля 2020

Мы можем использовать parse_expr из rlang

filterOrder = function( df, cond, value) {
   df %>% 
       rownames_to_column('date') %>%
       filter(!!(rlang::parse_expr("obj_200 > 0")))
      }

Воспроизводимый пример с iris

data(iris)
iris %>%
        filter(!!(rlang::parse_expr('Species == "setosa"')))
...