如何使用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))
但我似乎无法使用arrange
和desc
的字符串,这些是我尝试过的两个版本无效:
df %>% dplyr::arrange(dplyr::desc("b"))
df %>% dplyr::arrange_(dplyr::desc("b"))
谢谢!
答案 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))