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

时间:2014-11-20 08:10:21

标签: r dplyr

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

以下是一个示例数据集:

df <- data.frame(a = 1:3, b = 3:1)

有效的例子:

df %>% dplyr::arrange(b)
df %>% dplyr::arrange_("b")
df %>% dplyr::arrange(dplyr::desc(b))

但我似乎无法使用arrangedesc的字符串,这些是我尝试过的两个版本无效:

df %>% dplyr::arrange(dplyr::desc("b"))
df %>% dplyr::arrange_(dplyr::desc("b"))

谢谢!

1 个答案:

答案 0 :(得分:6)

  

tl; dr: df %>% arrange(desc(!!sym("b")))

首先,不推荐使用dplyr动词的标准评估,而不是:

library(dplyr)
x <- "b"
df %>% arrange_(x)

现在建议输入:

library(dplyr)
library(rlang)
df %>% arrange(!!sym(x))

请参阅?arrange_,它会链接到名为Deprecated SE versions of main verbs.的帮助主题,并提供一些详细信息。

从那里开始降序排列可以直接调整新配方:

df %>% arrange(desc(!!sym(x)))

如果您的数据未分组,这些也可以使用:

df %>% arrange(desc(.[[x]]))
df %>% arrange(desc(.data[[x]]))

仅供参考,为了使其与arrange_一起使用,我们可以做到以下几点,但更好地使用上述方法!

df %>% arrange_(paste0("desc(",x,")"))

如果我们有像OP示例中那样的数字变量,那么可以简化:

df %>% arrange_(paste0("-",x))

或使用lazyeval::interp

df %>% arrange_(interp(~desc(y),y=as.name(x)))

或者@ 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))