如何使用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"))谢谢!
发布于 2018-02-23 11:08:24
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]]))FYI,为了使它与arrange_一起工作,我们可以做以下工作,但是最好使用上面的方法!
df %>% arrange_(paste0("desc(",x,")"))如果我们有数值变量(如OP示例中的),则可以将其简化:
df %>% arrange_(paste0("-",x))或者使用lazyeval::interp
df %>% arrange_(interp(~desc(y),y=as.name(x)))或者像@saladi提议的那样:
desc_ <- function(x) lazyeval::interp(~desc(var), var = as.name(x))
# or just
# desc_ <- function(x) paste0("desc(",x,")")
df %>% arrange_(desc_(x))https://stackoverflow.com/questions/27034655
复制相似问题