使用字符串作为列名时如何使用dplyr :: arrange(desc())?

Dea*_*ali 9 r dplyr

如何使用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)

但我似乎无法使用字符串既arrangedesc,这是两个版本,我想,不工作:

df %>% dplyr::arrange(dplyr::desc("b"))
df %>% dplyr::arrange_(dplyr::desc("b"))
Run Code Online (Sandbox Code Playgroud)

谢谢!

Moo*_*per 7

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)

  • 自 dplyr 0.7.0 起,`arrange_(desc_(x))` 已被折旧 (2认同)