R语言 使用角色对象作为过滤条件无效

bsxbgnwa  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(118)

如果我想根据mpg〉10、气缸数等于4、马力大于100的条件过滤mtcars Dataframe ,我可以使用以下代码:

mtcars %>% 
  filter(mpg>10 & cyl ==4 & hp > 100)
#               mpg cyl  disp  hp drat    wt qsec vs am gear carb
# Lotus Europa 30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
# Volvo 142E   21.4   4 121.0 109 4.11 2.780 18.6  1  1    4    2

好的!!但是如果我尝试创建一个条件作为对象,我会得到一个错误:

my_string_filter_condition <- c("mpg>10 & cyl ==4 & hp > 100")

mtcars %>% 
  filter(my_string_filter_condition)
# Error in `filter()`:
# ! Problem while computing `..1 = my_string_filter_condition`.
# x Input `..1` must be a logical vector, not a character.
# Run `rlang::last_error()` to see where the error occurred.

# or

mtcars %>% 
  filter(rlang::parse_expr(my_string_filter_condition))
# Error in `filter()`:
# ! Problem while computing `..1 = rlang::parse_expr(my_string_filter_condition)`.
# Caused by error in `vec_size()`:
# ! `x` must be a vector, not a call.
# Run `rlang::last_error()` to see where the error occurred.

请帮个忙好吗?

yiytaume

yiytaume1#

parse_expr()返回一个表达式,您需要对它进行eval评估:

mtcars %>%
  filter(eval(rlang::parse_expr(my_string_filter_condition)))
#               mpg cyl  disp  hp drat    wt qsec vs am gear carb
# Lotus Europa 30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
# Volvo 142E   21.4   4 121.0 109 4.11 2.780 18.6  1  1    4    2
bejyjqdl

bejyjqdl2#

注意,表达式和字符串在R中是两个非常不同的东西。你不能把一个字符串放在任何地方,然后期望R自动解析和计算它。如果你有一个表达式,那么最好把它存储在一个表达式类型的对象中,而不是一个字符串。例如,你可以用rlang::expr创建一个表达式,然后用!!把这个表达式注入到dplyr函数中(!!注入只适用于使用rlang进行函数调用操作的函数--它不是一个基本的R特性,但在大多数tidyverse包中是常见的)

library(dplyr)
my_string_filter_condition <- rlang::expr(mpg>10 & cyl ==4 & hp > 100)

mtcars %>% 
  filter(!!my_string_filter_condition)
#               mpg cyl  disp  hp drat    wt qsec vs am gear carb
# Lotus Europa 30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
# Volvo 142E   21.4   4 121.0 109 4.11 2.780 18.6  1  1    4    2

相关问题