如何在group_by中传递变量名

Tom*_*ood 6 variables group-by r dplyr

我可以使用以下代码在组name1中的数据帧df中计算值(val)的排名:

res  <- df %>% arrange(val) %>% group_by(name1) %>% mutate(RANK=row_number()) 
Run Code Online (Sandbox Code Playgroud)

我不想在代码中编写“ name1”列,而是将其作为变量传递,例如crit =“ name1”。但是,由于假定crit1是列名而不是变量名,所以下面的代码不起作用。

res  <- df %>% arrange(val) %>% group_by(crit1) %>% mutate(RANK=row_number()) 
Run Code Online (Sandbox Code Playgroud)

如何在代码中传递crit1?

谢谢汤姆

akr*_*run 12

我们可以用 group_by_

library(dplyr)
df %>%
    arrange(val) %>% 
    group_by_(.dots=crit1) %>%
    mutate(RANK=row_number()) 
#Source: local data frame [10 x 4]
#Groups: name1, name2 [7]

#            val name1 name2  RANK
#          <dbl> <chr> <chr> <int>
#1  -0.848370044     b     c     1
#2  -0.583627199     a     a     1
#3  -0.545880758     a     a     2
#4  -0.466495124     b     b     1
#5   0.002311942     a     c     1
#6   0.266021979     c     a     1
#7   0.419623149     c     b     1
#8   0.444585270     a     c     2
#9   0.536585304     b     a     1
1#0  0.847460017     a     c     3
Run Code Online (Sandbox Code Playgroud)

更新资料

group_by_在最新版本中已弃用(现在使用dplyrversion- 0.8.1),因此我们可以使用group_by_at将字符串向量作为输入变量的形式

df %>%
  arrange(val) %>% 
  group_by_at(crit1) %>%
  mutate(RANK=row_number())
Run Code Online (Sandbox Code Playgroud)

或另一种选择是转换为符号(symsfrom rlang)并求值(!!!

df %>%
   arrange(val) %>% 
   group_by(!!! rlang::syms(crit1)) %>% 
   mutate(RANK = row_number())
Run Code Online (Sandbox Code Playgroud)

数据

set.seed(24)
df <- data.frame(val = rnorm(10), name1= sample(letters[1:3], 10, replace=TRUE), 
         name2 = sample(letters[1:3], 10, replace=TRUE), 
 stringsAsFactors=FALSE)

crit1 <- c("name1", "name2")
Run Code Online (Sandbox Code Playgroud)

  • 不推荐使用group_by_()。 (2认同)

Agi*_*ean 7

使用 dplyr 1.0.0 更新

across语法消除了对!!! rlang::syms(). 因此,您现在可以通过以下方式简化代码:

df %>%
   arrange(val) %>% 
   group_by(across(all_of(crit1))) %>% 
   mutate(RANK = row_number())
Run Code Online (Sandbox Code Playgroud)