如何使用条件表达式的 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
我有一个 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