在dplyr中结合标准和非标准评估

时间:2017-05-26 09:12:42

标签: r dataframe dplyr mutate

我正在尝试在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方法。

2 个答案:

答案 0 :(得分:2)

我们可以使用quosure的devel版本中的dplyr(即将发布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接受输入参数并转换为quosuremutate/summarise通过取消引用(UQ)在:=等内进行评估。请注意,我们可以通过取消引用字符串(&#39; nm1&#39;)来分配lhs gpuDevice上的值

;

注意:在这里,我们包含了&#39; dat&#39;作为另一个参数,以防函数需要应用于不同的数据集

答案 1 :(得分:2)

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

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