【问题标题】:How to pass a variable name in group_by如何在 group_by 中传递变量名
【发布时间】:2016-11-08 07:48:39
【问题描述】:

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

res  <- df %>% arrange(val) %>% group_by(name1) %>% mutate(RANK=row_number()) 

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

res  <- df %>% arrange(val) %>% group_by(crit1) %>% mutate(RANK=row_number()) 

如何在代码中传递 crit1?

谢谢, 汤姆

【问题讨论】:

    标签: r variables group-by dplyr


    【解决方案1】:

    使用 dplyr 1.0.0 更新

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

    df %>%
       arrange(val) %>% 
       group_by(across(all_of(crit1))) %>% 
       mutate(RANK = row_number())
    

    【讨论】:

      【解决方案2】:

      我们可以使用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
      

      更新

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

      df %>%
        arrange(val) %>% 
        group_by_at(crit1) %>%
        mutate(RANK=row_number())
      

      或者另一种选择是转换为符号(syms from rlang)并评估(!!!

      df %>%
         arrange(val) %>% 
         group_by(!!! rlang::syms(crit1)) %>% 
         mutate(RANK = row_number())
      

      数据

      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")
      

      【讨论】:

      • group_by_() 已弃用。
      • @Helen 感谢您的通知。我添加了两个适用于当前版本的dplyr 的选项
      • dplyr 也有syms 功能,无需明确指定rlang
      猜你喜欢
      • 2019-06-27
      • 1970-01-01
      • 2021-03-14
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2017-03-24
      相关资源
      最近更新 更多