我如何使用 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"))
谢谢!
最佳答案
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))
关于r - 使用字符串作为列名时如何使用 dplyr::arrange(desc())?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27034655/