如何使用条件表达式的 r 数据框来过滤数据的数据框?

How to use an r datafame of conditional expressions to filter a dataframe of data?

我有一个 r dataframe 的形式:

cond.expr <- data.frame("label" = c("foo", "bar", "baz"), 
                 "dim" = c("long","lat","long"), 
                 "cond" = c("!=", ">", "=="), 
                 "value" = c(NA, 0, 5))

我想将 cond.expr 解读为一组条件表达式,这些表达式随后可以应用于数据集。所以如果我有以下数据集:

data <- data.frame("label" = c("foo", "foo", "bar", "bar","baz","baz"), 
                   "long" = c(NA, 40,35,30,5,0), 
                   "lat" = c(2,3,1,-1,0,4 ))

并应用 filter(data, cond.expr) 形式的内容,我应该得到以下结果:

  label long lat
1   foo   40   3
2   bar   30  -1
3   baz    0   4

我想知道条件表达式的某种形式的 AST 是否适用于此?

条件需要是您在单引号内指定的字符向量,您指定一系列条件:'my_cond > a'

library(tidyverse)

cond.expr <- c(
  'label %in% c("foo", "bar", "baz")',
  !is.na(long),
  'lat > 0' ,
  'long == 5' 
  )

data <- data.frame(label = c("foo", "foo", "bar", "bar","baz","baz"), 
                   long = c(NA, 40,35,30,5,0), 
                   lat = c(2,3,1,-1,0,4 )) %>% as_data_frame()

然后我们创建一个函数来解析表达式,然后在过滤器中取消引用它


filter_conditions <- function(the_data,  filter_statement ) {
  filter_statement_expr <- rlang::parse_expr(filter_statement)

  the_data %>%
    dplyr::filter(!!filter_statement_expr)
}



filter_conditions(data, cond.expr)

最后我们 运行 我们的数据新函数

filter_conditions(data, cond.expr)

# A tibble: 1 x 3
  label  long   lat
  <fct> <dbl> <dbl>
1 baz       5     0