Tidyeval与功能列名称列表

我想创建一个函数,将列名称列表传递给dplyr函数。我知道,如果列名称的列表中...形式给出如何做到这一点,作为tidyeval文档中解释说: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,但在评论中建议使用字符串,而在这里我想使用裸列名。

回答:

您可以使用alist而不是list来传递参数列表,因为它不会评估参数。

my_summarise = function(df, group_var, sum_var) { 

group_var = quos(!!! group_var)

sum_var = enquo(sum_var)

df %>%

group_by(!!! group_var) %>%

summarise(!! quo_name(sum_var) := mean(!! sum_var))

}

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

# A tibble: 4 x 3

# Groups: g1 [?]

g1 g2 b

<dbl> <dbl> <dbl>

1 1 1 2.0

2 1 2 3.0

3 2 1 4.5

4 2 2 1.0

另一种方法是直接与quos代替list通过这样的说法,如图in this answer,它绕过一些并发症都在一起。

my_summarise = function(df, group_var, sum_var) { 

# group_var = quos(!!! group_var)

sum_var = enquo(sum_var)

df %>%

group_by(!!! group_var) %>%

summarise(!! quo_name(sum_var) := mean(!! sum_var))

}

my_summarise(df, quos(g1, g2), b)

# A tibble: 4 x 3

# Groups: g1 [?]

g1 g2 b

<dbl> <dbl> <dbl>

1 1 1 2.0

2 1 2 3.0

3 2 1 4.5

4 2 2 1.0

回答:

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'的意思,还可以通过传递函数来概括它。

以上是 Tidyeval与功能列名称列表 的全部内容, 来源链接: utcz.com/qa/265516.html

回到顶部