我正在尝试在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方法。
答案 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
接受输入参数并转换为quosure
,mutate/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)
}