如何使用列名作为字符串的整洁评估?
How to use tidy evaluation with column name as strings?
我已经阅读了大部分关于使用 dplyr 进行整洁评估和编程的文档,但无法理解这个(简单的)问题。
我想用 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) {
df %>%
group_by(group_var) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
这给了我 Error : Column 'group_var' is unknown
.
我必须在 my_summarise 函数内部更改什么才能使其正常工作?
使用 as.name()
将字符串列名转换为裸列名,然后使用新的 {{}}(读作 Curly-Curly)运算符,如下所示:
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) {
grp_var <- as.name(group_var)
df %>%
group_by({{grp_var}}) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
我们也可以使用 ensym
和 !!
my_summarise <- function(df, group_var) {
df %>%
group_by(!!rlang::ensym(group_var)) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
或者另一种选择是group_by_at
my_summarise <- function(df, group_var) {
df %>%
group_by_at(vars(group_var)) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
您还可以使用 sym
和 !!
my_summarise <- function(df, group_var) {
df %>%
group_by(!!sym(group_var)) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
# A tibble: 2 x 2
g1 a
<dbl> <dbl>
1 1 3.5
2 2 2.67
我已经阅读了大部分关于使用 dplyr 进行整洁评估和编程的文档,但无法理解这个(简单的)问题。
我想用 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) {
df %>%
group_by(group_var) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
这给了我 Error : Column 'group_var' is unknown
.
我必须在 my_summarise 函数内部更改什么才能使其正常工作?
使用 as.name()
将字符串列名转换为裸列名,然后使用新的 {{}}(读作 Curly-Curly)运算符,如下所示:
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) {
grp_var <- as.name(group_var)
df %>%
group_by({{grp_var}}) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
我们也可以使用 ensym
和 !!
my_summarise <- function(df, group_var) {
df %>%
group_by(!!rlang::ensym(group_var)) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
或者另一种选择是group_by_at
my_summarise <- function(df, group_var) {
df %>%
group_by_at(vars(group_var)) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
您还可以使用 sym
和 !!
my_summarise <- function(df, group_var) {
df %>%
group_by(!!sym(group_var)) %>%
summarise(a = mean(a))
}
my_summarise(df, 'g1')
# A tibble: 2 x 2
g1 a
<dbl> <dbl>
1 1 3.5
2 2 2.67