当前位置: 首页 > 知识库问答 >
问题:

arrange_() 具有降序的多个列

舒枫涟
2023-03-14

我正在尝试使用arrange_()与字符串输入和其中一列降序。

library(dplyr) # R version 3.3.0 (2016-05-03) , dplyr_0.4.3 
# data
set.seed(1)
df1 <- data.frame(grp = factor(c(1,2,1,2,1)),
                  x = round(runif(5,1,10), 2))

#   grp    x
# 1   1 3.39
# 2   2 4.35
# 3   1 6.16
# 4   2 9.17
# 5   1 2.82

以下是我需要实现的目标:

df1 %>% arrange(grp, -x)
df1 %>% arrange(grp, desc(x))
#   grp    x
# 1   1 6.16
# 2   1 3.39
# 3   1 2.82
# 4   2 9.17
# 5   2 4.35

在我的例子中,第二列是一个字符串

#dynamic string
myCol <- "x"

#failed attempts
df1 %>% arrange_("grp", desc(myCol))

错误:大小不正确 (1),预期:5

df1 %>% arrange_("grp", "desc(myCol)")

错误:找不到对象“myCol”

df1 %>% arrange_(c("grp", "desc(myCol)"))
#wrong output
#   grp    x
# 1   1 3.39
# 2   1 6.16
# 3   1 2.82
# 4   2 4.35
# 5   2 9.17

我在这里找到了类似的解决方案,但无法使其工作:

df1 %>% arrange_(.dots = c("grp", "desc(myCol)"))

错误:找不到对象“myCol”

感觉我错过了一些很明显的东西,想法?

共有2个答案

孟和玉
2023-03-14

这可能会成功:< code>arrange(grp,cross(c(x),desc))

< code>dplyr版本< code>1.0.5

车嘉实
2023-03-14

我们可以将“desc”作为一个字符串来进行评估。

myCol1 <- paste0("desc(", "x)")
df1 %>% 
     arrange_(.dots = c("grp", myCol1))
#  grp    x
#1   1 6.16
#2   1 3.39
#3   1 2.82
#4   2 9.17
#5   2 4.35

或者用“我的科尔”

df1 %>% 
      arrange_(.dots = c("grp", paste0("desc(", myCol, ")")))

或者使用懒惰

library(lazyeval)
df1 %>%
     arrange_(.dots = c("grp", interp(~ desc(n1), n1 = as.name(myCol))))
#  grp    x
#1   1 6.16
#2   1 3.39
#3   1 2.82
#4   2 9.17
#5   2 4.35

通过使用"desc(myCol)",它是一个字符串,不计算'myCol'的值。

或者另一个选项是parse_expr(来自rlang)并使用进行评估!!

df1 %>%
    arrange(grp, !! rlang::parse_expr(myCol1))
#grp    x
#1   1 6.16
#2   1 3.39
#3   1 2.82
#4   2 9.17
#5   2 4.35

或者在OP的帖子中使用原始字符串。将字符串转换为符号 (sym),计算 (!!) 并按降序 (desc) 顺序排列

myCol <- "x"
df1 %>% 
    arrange(grp, desc(!! rlang::sym(myCol)))
# grp    x
#1   1 6.16
#2   1 3.39
#3   1 2.82
#4   2 9.17
#5   2 4.35




 
 类似资料:
  • 我正在尝试实现以下实现Iterable的deque: 但是如果我试着用下面的代码测试它,它会进入一个无限循环。发生了什么事?编译器不会返回任何类型的错误,我也不知道迭代器类的实现是否正确。

  • 问题内容: 我想在Java中实现具有多个值的哈希表,即 并且将返回2倍的值。 我怎样才能做到这一点? 问题答案: 您可以改用Multimap。它在列表中为一个键保留多个值。在commons- collection 和Guava中有实现。 这类似于使用值是列表的Hashmap,但是不必显式创建列表。 自己动手做的同一示例如下所示: 请注意,您可以将Multimap用作构建器,并对其调用asMap以返

  • 问题内容: 我需要一种简单的方法来实现JScrollPane,在其中我可以添加JTextAreas。正如您在youtube和Stackoverflow上看到的那样,这应该像评论系统一样工作。 它应该在Java代码中,如果有的话,我想知道它。 我的评论对象包含: 我将评论保存在数据库中,可以轻松启动它们。问题是显示部分。 谢谢您的帮助 问题答案: 你必须承认,有可能把只有一个JComponent中的

  • 我尝试使用thajaxb来整理xml,我使用xjc命令从xsd文件order.xsd生成java类 我得到了许多带注释的类,但没有一个@XmlRootElement(name="Order"),也没有名为Order的类

  • 我们刚刚开始在Spring Boot应用程序中使用JaVers。此应用程序作为两个EntityManagerFactory bean: 有没有办法告诉沙弗斯只关心@初级工厂? 谢了! 戴夫

  • 问题内容: 我必须对具有多个属性的列表进行排序。我可以轻松地按升序对所有属性执行此操作 但是问题是,我必须使用混合配置来进行升序/降序…我必须“模仿”一点SQL ,在SQL中您可以执行类似的操作。有没有一种方法可以在Python中轻松实现,而无需实现自定义比较功能? 问题答案: 如果您的属性是数字,则具有此属性。 如果您的属性包括字符串或其他更复杂的对象,则可以选择。 该方法很稳定:您可以进行多次