将列名作为字符串传递给 group_by 并汇总
Pass column names as strings to group_by and summarize
从 dplyr 0.7 开始,以下划线结尾的方法如 summarize_ group_by_ 已被弃用,因为我们应该使用 quosures。
见:
https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html
我正在尝试使用 quo 和 !! 实现以下示例
工作示例:
df <- data.frame(x = c("a","a","a","b","b","b"), y=c(1,1,2,2,3,3), z = 1:6)
lFG <- df %>%
group_by( x,y)
lFG %>% summarize( min(z))
但是,在这种情况下,我需要将要分组和汇总的列指定为字符串。
cols2group <- c("x","y")
col2summarize <- "z"
我怎样才能让上面的例子正常工作?
为此,您现在可以使用 _at
版本的动词
df %>%
group_by_at(cols2group) %>%
summarize_at(.vars = col2summarize, .funs = min)
编辑 (2021-06-09):
请参阅 Ronak Shah 的回答,使用
mutate(across(all_of(cols2summarize), min))
现在首选
另一种选择是使用非标准评估 (NSE),并让 R 将字符串解释为对象的引用名称:
cols2group <- c("x","y")
col2summarize <- "z"
df %>%
group_by(!!rlang::sym(cols2group)) %>%
summarize(min(!!rlang::sym(col2summarize)))
rlang::sym()
函数获取字符串并将它们转换为引号,!!
又不加引号,并在 df
的上下文中用作名称,它们指的是相关栏目。一如既往,有不同的方法可以做同样的事情,这就是我倾向于使用的 shorthand!
请参阅 ?dplyr::across 了解更新的方法,因为 group_by_at 和 summarize_at 现已被取代
从 dplyr
1.0.0 开始,您可以使用 across
:
library(dplyr)
cols2group <- c("x","y")
col2summarize <- "z"
df %>%
group_by(across(all_of(cols2group))) %>%
summarise(across(all_of(col2summarize), min)) %>%
ungroup
# x y z
# <chr> <dbl> <int>
#1 a 1 1
#2 a 2 3
#3 b 2 4
#4 b 3 5
从 dplyr 0.7 开始,以下划线结尾的方法如 summarize_ group_by_ 已被弃用,因为我们应该使用 quosures。
见: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html
我正在尝试使用 quo 和 !! 实现以下示例
工作示例:
df <- data.frame(x = c("a","a","a","b","b","b"), y=c(1,1,2,2,3,3), z = 1:6)
lFG <- df %>%
group_by( x,y)
lFG %>% summarize( min(z))
但是,在这种情况下,我需要将要分组和汇总的列指定为字符串。
cols2group <- c("x","y")
col2summarize <- "z"
我怎样才能让上面的例子正常工作?
为此,您现在可以使用 _at
版本的动词
df %>%
group_by_at(cols2group) %>%
summarize_at(.vars = col2summarize, .funs = min)
编辑 (2021-06-09):
请参阅 Ronak Shah 的回答,使用
mutate(across(all_of(cols2summarize), min))
现在首选
另一种选择是使用非标准评估 (NSE),并让 R 将字符串解释为对象的引用名称:
cols2group <- c("x","y")
col2summarize <- "z"
df %>%
group_by(!!rlang::sym(cols2group)) %>%
summarize(min(!!rlang::sym(col2summarize)))
rlang::sym()
函数获取字符串并将它们转换为引号,!!
又不加引号,并在 df
的上下文中用作名称,它们指的是相关栏目。一如既往,有不同的方法可以做同样的事情,这就是我倾向于使用的 shorthand!
请参阅 ?dplyr::across 了解更新的方法,因为 group_by_at 和 summarize_at 现已被取代
从 dplyr
1.0.0 开始,您可以使用 across
:
library(dplyr)
cols2group <- c("x","y")
col2summarize <- "z"
df %>%
group_by(across(all_of(cols2group))) %>%
summarise(across(all_of(col2summarize), min)) %>%
ungroup
# x y z
# <chr> <dbl> <int>
#1 a 1 1
#2 a 2 3
#3 b 2 4
#4 b 3 5