【问题标题】:How do I do Standard evaluation with dplyr's arrange?如何使用 dplyr 的安排进行标准评估?
【发布时间】:2019-10-28 23:25:47
【问题描述】:

dplyr 的 arrange 似乎不适用于 !!

请参阅 MWE,我正在尝试按“日期”变量对 data.frame 进行排序,但我不想使用 date,而是想使用字符/字符串对其进行参数化

library(dplyr)

a = data.frame(date = 1:3, ok = 1:3)

a %>% 
  arrange(date)

date = "date"
a %>% 
  arrange(!!date) # doesn't work


meh = "date"
a %>% 
  arrange(!!meh) # doesn't work

我认为!! 可以在任何 dplyr 函数中用于执行变量的标准评估 (SE)。理解不正确吗?我该如何纠正这个问题?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我不知道为什么!! 不适用于安排,但您仍然可以使用get

    a %>% arrange(get(meh))
    
    
    #  date ok
    #1    1  1
    #2    2  2
    #3    3  3
    

    【讨论】:

      【解决方案2】:

      使用.data 变量:

      a %>% arrange(.data[[date]])
      

      这里有更多例子:

      aa <- data.frame(date = c(13, 14, 11), ok = 3:1)
      
      # sort by date
      date <- "date"
      aa %>% arrange(.data[[date]])
      ##   date ok
      ## 1   11  1
      ## 2   13  3
      ## 3   14  2
      
      # sort by ok
      date <- "ok"
      aa %>% arrange(.data[[date]])
      ##   date ok
      ## 1   11  1
      ## 2   14  2
      ## 3   13  3
      

      【讨论】:

        【解决方案3】:

        一种方法(似乎有点迂回但仍然有效)是在应用取消引用运算符之前使用rlang::sym

        library(dplyr)
        
        a = data.frame(date = 3:1, ok = 1:3)
        
        a %>% 
          arrange(date)
        
        acol = "date"
        a %>% 
          arrange(!!rlang::sym(acol))
        

        这里还有一个详尽的指南:dplyr programming guide

        另见this answer;基本一样。

        编辑 TIL 通过 Diceboy 的有用评论,有很多方法可以处理多个变量:

        a %>% arrange(get(name1),get(name2))
        a %>% arrange(.data[[name1,name2]])
        a %>% arrange(!!!rlang::syms(c(name1,name2)))
        

        虽然mget 不能很好地工作!

        【讨论】:

        • 此外,a %&gt;% arrange(!!!syms(meh)) 也可以在 meh 是长度大于 1 的字符向量时起作用(即当您希望 arrange 超过 1 列时)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-10
        • 1970-01-01
        相关资源
        最近更新 更多