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

标签 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"))

谢谢!

最佳答案

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/

相关文章:

r - 如何在特定嵌套级别选择列表的所有元素?

r - 使用 dplyr 计算与组均值的差异

r - 在 Shiny 中显示 dbplyr 收集进度

r - dplyr 覆盖组中除第一次出现以外的所有值

r - 用正值和负值标记堆叠条形图

r - 优化 r 中函数的函数

R dplyr 对仅由其字符串名称已知的列进行操作

r - 如何在包含特定字符串的最后一列之后添加一列?

r - 如何在 case_when 中传递列名向量

r - 在 R 中交换字符串与数字