12

从 dplyr 0.7 版开始,不推荐使用以下划线结尾的方法,例如 summarise_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"

我怎样才能得到与上面相同的例子?

4

4 回答 4

14

为此,您现在可以使用_at动词的版本

df %>%  
  group_by_at(cols2group) %>% 
  summarize_at(.vars = col2summarize, .funs = min)

编辑(2021-06-09):

请参阅 Ronak Shah 的回答,使用

mutate(across(all_of(cols2summarize), min))

现在首选

于 2017-10-24T19:51:42.143 回答
6

dplyr1.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
于 2021-04-02T03:14:40.160 回答
3

另一种选择是使用非标准评估 (NSE),并让 R 将字符串解释为带引号的对象名称:

cols2group <- c("x","y")
col2summarize <- "z"

df %>%  
  group_by(!!rlang::sym(cols2group)) %>% 
  summarize(min(!!rlang::sym(col2summarize)))

rlang::sym()函数获取字符串并将它们转换为引号,而引号又不被引用!!并用作df它们引用相关列的上下文中的名称。和往常一样,做同一件事有不同的方法,这是我倾向于使用的速记!

于 2020-11-18T19:12:47.467 回答
1

请参阅 ?dplyr::across 以获取更新的方法,因为 group_by_at 和 summarise_at 现在已被取代

于 2020-12-20T14:42:45.650 回答