【问题标题】:How to use dplyr::arrange(desc()) when using a string as column name?使用字符串作为列名时如何使用 dplyr::arrange(desc())?
【发布时间】:2014-11-20 08:10:20
【问题描述】:

如何使用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"))

谢谢!

【问题讨论】:

  • 可能是这样的df %&gt;% dplyr::arrange(dplyr::desc(df["b"]))?坦率地说,我不确定......
  • 你需要使用 interp
  • 感谢提示和欺骗发现,但我仍然不知道如何使用 interp(来自lazyeval 包?)来使这个简单的示例工作。我将继续尝试了解 NSE,但如果您也可以发布解决方案,如果它不会花费您太多时间,那就太棒了。还是非常感谢
  • 引用 Henrik 对我已删除答案的评论:“df &lt;- data.frame(a = 3:1, b = 1:3);作为字符串排序的变量:sort_var &lt;- "b";然后使用我提到的小插图中的示例:df %&gt;% arrange_(interp(~desc(var), var = as.name(sort_var)))”还要确保首先安装并加载包lazyeval
  • 一个新的便利功能desc_ &lt;- function(x) { lazyeval::interp(~desc(var), var = as.name(x)) }很好

标签: r dplyr


【解决方案1】:

tl;博士: df %&gt;% 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))

【讨论】:

  • arrange_(desc_(x)) 自 dplyr 0.7.0 起折旧
猜你喜欢
  • 2021-12-16
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 2021-05-19
相关资源
最近更新 更多