gpt4 book ai didi

r - 将 quosure 和 format 拼接成字符串列表

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

by dplyr::left_join 中的参数(和 friend )需要一个字符串列表。我的代码已经将感兴趣的变量定义为定语列表,因此我希望通过将定语列表转换为字符串列表来避免再次写下该列表。

我去寻找rlang文档但没有找到现有的解决方案。 quo_expr函数族可以将 quosures 拼接并转换为单个字符串,但它们不会生成字符串列表:

library(rlang)

# this works
sepal_length <- quo(Sepal.Length)
quo_text(sepal_length)

# this doesnt
sepaldims <- quos(Species, Sepal.Length)
quo_text(sepaldims)

这是一个有用的示例:

library(dplyr)

# group_by accepts a list of quosures
sepaldims <- quos(Species, Sepal.Length)
iris_sepal <- iris %>%
group_by(!!!sepaldims) %>%
summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width))
petaldims <- quos(!!!sepaldims, Petal.Length)
iris_petal <- iris %>%
group_by(!!!petaldims) %>%
summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width))

# but left join expects a list of strings
iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length"))

最佳答案

我想出的解决方案将 quo_text 应用于列表:

quos_text <- function(qs) {
unlist(lapply(seq_along(qs), function(i) quo_text(qs[[i]])))
}

现在我们可以处理配额列表:

sepaldims <- quos(Species, Sepal.Length)
petaldims <- quos(!!!sepaldims, Petal.Length)

quos_text(sepaldims)
quos_text(petaldims)
quos_text(quos(!!!sepaldims, Petal.Width))

并且 left_join 满足:

# these two are equivalent
iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length"))
iris_merge2 <- left_join(iris_sepal, iris_petal, by = quos_text(sepaldims))

@Marius 指出我们可以使用一种更简单的形式:

sapply(qs, quo_text)

这足够短,我可能会内联使用它而不是作为自定义函数。

关于r - 将 quosure 和 format 拼接成字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045338/

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