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

当使用字符串作为列名时,如何使用dplyr::arrange(desc())?,r,dplyr,R,Dplyr,如何使用dplyr::arrange(dplyr::desc())并传入字符串作为列名 以下是一个示例数据集: df <- data.frame(a = 1:3, b = 3:1) 但我似乎无法将字符串同时用于arrange和desc,这是我尝试过的两个不起作用的版本: df %>% dplyr::arrange(dplyr::desc("b")) df %>% dplyr::arrange_(dplyr::desc("b")) 谢谢 tl;dr:df%>%排列(描述(!!

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

以下是一个示例数据集:

df <- data.frame(a = 1:3, b = 3:1)
但我似乎无法将字符串同时用于
arrange
desc
,这是我尝试过的两个不起作用的版本:

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

tl;dr:
df%>%排列(描述(!!符号(“b”))

首先,不推荐使用
dplyr
动词的标准求值,因此:

library(dplyr)
x <- "b"
df %>% arrange_(x)
请参见
?排列
,它链接到一个名为
主要动词的已弃用SE版本的帮助主题。
并提供了一些详细信息

从这里开始,我们可以直接采用新的公式:

df %>% arrange(desc(!!sym(x)))
如果您的数据未分组,这些功能也可以使用:

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

仅供参考,为了使其与
arrange_uu
一起工作,我们本可以做以下工作,但最好使用上述方法

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))

desc_uu可能是这样的
df%>%dplyr::arrange(dplyr::desc(df[“b”]))
?坦白地说,我不确定…你需要使用interp谢谢你的提示和重复发现,但我仍然不知道如何使用interp(来自lazyeval软件包?)来让这个简单的例子工作。我会继续尝试理解NSE,但如果你也能发布解决方案(如果不花费你太多时间的话),那就太神奇了。无论如何,非常感谢Henrik对我删除的答案的评论:“
df一个新的便利功能
desc\ucode>arrange\ux(desc\ux))
从dplyr 0.7.0开始折旧
df %>% arrange_(interp(~desc(y),y=as.name(x)))
desc_ <- function(x) lazyeval::interp(~desc(var), var = as.name(x))
# or just
# desc_ <- function(x) paste0("desc(",x,")")
df %>% arrange_(desc_(x))