gpt4 book ai didi

r - 使用函数中的列名称列表进行 Tidyeval

转载 作者:行者123 更新时间:2023-12-02 20:33:10 27 4
gpt4 key购买 nike

我正在尝试创建一个将列名称列表传递给 dplyr 函数的函数。如果列名称列表以 ... 形式给出,我知道如何执行此操作,如 tidyeval 文档中所述:

df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 2, 1),
a = sample(5),
b = sample(5)
)

my_summarise <- function(df, ...) {
group_var <- quos(...)

df %>%
group_by(!!!group_var) %>%
summarise(a = mean(a))
}

my_summarise(df, g1, g2)

但是如果我想将列名列出作为函数的参数,则上述解决方案将不起作用(当然):

my_summarise <- function(df, group_var, sum_var) {
group_var <- quos(group_var) # nor enquo(group_var)
sum_var <- enquo(sum_var)

df %>%
group_by(!!!group_var) %>%
summarise(a = mean(a))
}

my_summarise(df, list(g1, g2), a)
my_summarise(df, list(g1, g2), b)

如何才能将列表中的项目单独引用?

这个问题类似于Passing dataframe column names in a function inside another function但在评论中建议使用字符串,而在这里我想使用裸列名称。

最佳答案

library(dplyr)

df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 2, 1),
a = sample(5),
b = sample(5)
)

my_summarise = function(df, group_var, fun_name) {

df %>%
group_by(!!! group_var) %>%
summarize_all(fun_name)
}

my_summarise(df, alist(g1, g2), mean)

alist() 将参数 'g1' 和 'g2' 作为函数参数处理(不评估它们),而!!! (与 UQS() 取消引号并拼接列表相同。 sum_var 不是必需的,因为看起来您想取 'a' 和 'b' 的平均值。此外,您也可以通过传入函数来概括它。

关于r - 使用函数中的列名称列表进行 Tidyeval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47993471/

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