gpt4 book ai didi

r - 根据 dplyr 中的字符串(或字符串向量)应用过滤器向量

转载 作者:行者123 更新时间:2023-12-04 01:36:47 25 4
gpt4 key购买 nike

R 和 tidyverse 有一些非常强大但同样神秘的方法可以将字符串转换为可操作的表达式。我觉得一个人需要成为专家才能真正了解如何使用它们。

注意:这个问题不同于 this one因为我特别询问了一个向量(即多个)过滤条件。我演示了一个解决方案,当我尝试多种方法将其扩展到多个过滤器时,该解决方案失败了。

我想做一些事情:

df = data.frame(A=1:10, B=1:10)
df %>% filter(A<3, B<5)

但是过滤器包含在字符串中,例如 "A<3, B<5"或字符向量,例如 c("A<3", "B<5") .

我可以

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") 不同

但这不是从字符串开始的。

该怎么办?

最佳答案

您可以使用 parse_exprs来自 rlang

library(dplyr)
expr <- c("A<3", "B<5")

filter(df, !!!rlang::parse_exprs(expr))

# A B
#1 1 1
#2 2 2

或者你可以组合这两个表达式,然后在 eval 中使用它
filter(df, eval(parse(text = paste0(expr, collapse = "&"))))

# A B
#1 1 1
#2 2 2

关于r - 根据 dplyr 中的字符串(或字符串向量)应用过滤器向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59208791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com