【问题标题】:Combining standard and non standard evaluation in dplyr在 dplyr 中结合标准和非标准评估
【发布时间】:2017-10-27 03:02:16
【问题描述】:

我正在尝试在 dplyr 中执行一项应结合非标准和标准评估的任务,但我找不到方便的解决方案。我想根据 data.frame 中的另一列重新排序一个级别(可视化所需):

df <- data.frame(A = c(1,2,5,4), B = c("A", "B", "C","D"))
levels(df$B)
df2 <- df %>% mutate(B  = factor(B, levels = unique(B)[order(A, decreasing = FALSE)]))
levels(df$B)

到目前为止,一切都很好。但现在我想做完全相同的任务,但 B 是函数的输入:

ReorderFactor <- function(column_name){
    df2 <- df %>% mutate(column_name  = factor(column_name, levels = unique(column_name)[order(A, decreasing = FALSE)]))
    return(df2)
}
ReorderFactor(column_name = "B")

所以我想结合标准和非标准评估。我正在寻找一种 dplyr 方法。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    您可以使用mutate_at,然后将被变异的变量称为.

    ReorderFactor <- function(column_name){
      df2 <- df %>% 
        mutate_at(column_name, funs(factor(., levels = unique(.)[order(A, decreasing = FALSE)])) ) 
      return(df2)
    }
    

    【讨论】:

      【解决方案2】:

      我们可以使用dplyr开发版中的quosure(即将发布0.6.0

      ReorderFactor <- function(dat, column_name){
                column_name <- enquo(column_name)
                nm1 <- quo_name(column_name)
                dat %>%
                    mutate(UQ(nm1) := factor(UQ(column_name), 
                         levels = unique(UQ(column_name))[order(A, decreasing = FALSE)]))
      
      }
      
      dfN <- ReorderFactor(df, B)
      identical(df2, dfN)
      #[1] TRUE
      

      这里,enquo 接受输入参数并转换为 quosure,在 mutate/summarise 等中通过取消引用 (UQ) 对其进行评估。请注意,我们可以通过取消引用字符串 ('nm1') 来分配 (:=) lhs 上的值

      注意:在这里,我们将“dat”作为另一个参数,以防函数需要应用于不同的数据集

      【讨论】:

      • 不幸的是,我无法测试这个解决方案,因为这个包还没有放在 cran 上。是否有发布将在 cran 上发布的日期?在不使用 0.6.0 版的情况下是否还有解决方法?
      • @TobiasDekker 你可以使用devtoolsgithub.com/tidyverse/dplyr从github安装它
      猜你喜欢
      • 2020-09-17
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多