如何使用dplyr::arrange(dplyr::desc())并传入字符串作为列名?
这是一个示例数据集:
df <- data.frame(a = 1:3, b = 3:1)
Run Code Online (Sandbox Code Playgroud)
有效的例子:
df %>% dplyr::arrange(b)
df %>% dplyr::arrange_("b")
df %>% dplyr::arrange(dplyr::desc(b))
Run Code Online (Sandbox Code Playgroud)
但我似乎无法使用字符串既arrange和desc,这是两个版本,我想,不工作:
df %>% dplyr::arrange(dplyr::desc("b"))
df %>% dplyr::arrange_(dplyr::desc("b"))
Run Code Online (Sandbox Code Playgroud)
谢谢!
tl; dr:
df %>% arrange(desc(!!sym("b")))
首先,dplyr不赞成使用动词的标准评估,因此,代替:
library(dplyr)
x <- "b"
df %>% arrange_(x)
Run Code Online (Sandbox Code Playgroud)
现在建议键入:
library(dplyr)
library(rlang)
df %>% arrange(!!sym(x))
Run Code Online (Sandbox Code Playgroud)
请参阅?arrange_,它链接到名为的帮助主题,Deprecated SE versions of main verbs.并提供了一些详细信息。
从那里到降序排序,很容易适应新的公式:
df %>% arrange(desc(!!sym(x)))
Run Code Online (Sandbox Code Playgroud)
如果您的数据未分组,这些也将起作用:
df %>% arrange(desc(.[[x]]))
df %>% arrange(desc(.data[[x]]))
Run Code Online (Sandbox Code Playgroud)
仅供参考,为了使其与arrange_我们一起工作,我们可以做以下事情,但是更好地使用上面的方法!
df %>% arrange_(paste0("desc(",x,")"))
Run Code Online (Sandbox Code Playgroud)
如果我们有数字变量(如OP的示例),则可以简化该过程:
df %>% arrange_(paste0("-",x))
Run Code Online (Sandbox Code Playgroud)
或使用 lazyeval::interp
df %>% arrange_(interp(~desc(y),y=as.name(x)))
Run Code Online (Sandbox Code Playgroud)
或@ shyam-saladi建议:
desc_ <- function(x) lazyeval::interp(~desc(var), var = as.name(x))
# or just
# desc_ <- function(x) paste0("desc(",x,")")
df %>% arrange_(desc_(x))
Run Code Online (Sandbox Code Playgroud)