R 和 tidyverse 有一些极其强大但同样神秘的方法可以将字符串转换为可操作的表达式。我觉得一个人需要成为一名专家才能真正理解如何使用它们。
NOTE:这个问题不同于this one https://stackoverflow.com/questions/49803104/how-to-pass-an-expression-in-a-string-to-a-verb-in-dplyr-0-7-2因为我特别询问向量(多个)过滤条件。我演示了一个针对单个过滤器的解决方案,当我尝试多种方法将其扩展到多个过滤器时,该解决方案会失败。
我想做一些类似的事情:
df = data.frame(A=1:10, B=1:10)
df %>% filter(A<3, B<5)
但是过滤器包含在字符串中,例如"A<3, B<5"
或字符向量,例如c("A<3", "B<5")
.
I can do
df %>% filter(eval(str2expression("A<3")))
# A B
# 1 1 1
# 2 2 2
但这不起作用:
df %>% filter(eval(str2expression("A<3, B<5")))
Error in str2expression("A<3, B<5") : <text>:1:4: unexpected ','
1: A<3,
^
这些也不起作用:
> df %>% filter(!!c(str2expression("A<3"), str2expression("B<5")))
Error: Argument 2 filter condition does not evaluate to a logical vector
> df %>% filter(!!!c(str2expression("A<3"), str2expression("B<5")))
Error: Can't splice an object of type `expression` because it is not a vector
Run `rlang::last_error()` to see where the error occurred.
评估表达式向量str2expression
由于某种原因只应用最后一个表达式:
> df %>% filter(eval(c(str2expression("A<3"), str2expression("B<5"))))
# A B
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
使用评估表达式向量完全失败:
> df %>% filter(!!!c(eval(str2expression("A<3")), eval(str2expression("B<5"))))
Error in eval(str2expression("A<3")) : object 'A' not found
我可以:
> df %>% filter(!!!c(expr(A<3), expr(B<5)))
# A B
# 1 1 1
# 2 2 2
这告诉我expr(A<3)
与以下不同str2expression("A<3")
但这并不是从字符串开始的。
该怎么办?