gpt4 book ai didi

r - 如何在 dplyr::select() 中使用动态 tidy-select 表达式?

转载 作者:行者123 更新时间:2023-12-05 02:32:21 25 4
gpt4 key购买 nike

我需要在多个表达式上动态选择变量。考虑以下示例:

library(tidyverse)
set.seed(42)

df <- tibble(
grey_dog = runif(n = 69),
white_bear = runif(n = 69),
blue_oyster = runif(n = 69),
white_lobster = runif(n = 69),
green_dog = runif(n = 69)
)

df %>%
dplyr::select(
(contains("dog") & contains("green")) |
(contains("white") & contains("bear"))
)

我没有明确选择,而是使用包含我希望基于我的选择的信息的向量:

x <- c(green = "dog", white = "bear")

所以我希望连接一个可以用作 tidy-select 的字符串:

s <- paste0("(", paste0("contains(", names(x),") & contains(", x, ")"), ")", collapse = " | ")
dplyr::select(df, s)

这失败了:

Error: Can't subset columns that don't exist.
x Column `(contains(green) & contains(dog)) | (contains(white) & contains(bear))` doesn't exist.
Run `rlang::last_error()` to see where the error occurred.

关于如何实现这一点有什么想法吗?

最佳答案

你不能只传入一个字符串。字符串与表达式不同。一种方法是使用 purrrrlang 构建表达式,然后将其注入(inject)到 select

library(purrr)
library(rlang)
query <- map2(
map(x, ~expr(contains(!!.x))),
map(names(x), ~expr(contains(!!.x))),
~expr((!!.x & !!.y))) %>%
reduce(~expr(!!.x | !!.y))
dplyr::select(df, !!query)

虽然如果您真的想将代码构建为字符串,那么您只需要先使用 rlang::parse_expr 将该字符串解析为表达式。您只需要在字符串中添加一些引号,使其与您之前使用的代码完全匹配

s <- paste0("(", paste0("contains(\"", names(x),"\") & contains(\"", x, "\")"), ")", collapse = " | ")
dplyr::select(df, !!rlang::parse_expr(s))

关于r - 如何在 dplyr::select() 中使用动态 tidy-select 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71270868/

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