【问题标题】:Reorder Dataframe based on Character Vector基于字符向量重新排序数据帧
【发布时间】:2016-06-30 13:49:08
【问题描述】:

我认为这应该很简单,但我找不到这样做的方法。

我想根据一个因素对数据框重新排序。到目前为止,我能找到的所有答案都提供了逻辑排序,但这是任意的,并且是数字和字母的混合。也许这是一个问题,因为它是factor 而不是vector?但是向量的答案似乎也不起作用。

任何建议将不胜感激!

示例数据 (注意;这些数据只是针对这个问题,在我的真实代码中,数据框是其他一些计算的输出,所以我不能一开始就将名称更改为合理的名称)

DATA<- data.frame(This=c("120", "60", "90", "OG"), That=c(453, 679,12,252))

DATA

  This That
1  120  453
2   60  679
3   90   12
4   OG  252

我想按 60 - 90 - 120 - OG 的顺序排序,即

  This That
1  60   679
2  90   12
3  120  453
4  OG   252

编辑:这不是重复的问题。如上所述,在下面的评论中,排序是任意的。字典排序假设行名是相互关联的,这里不是这种情况。我本可以标记行 ("unicorn", "18.1", "TREES", "234234235") 并希望它们按顺序排列 ("234234235", "unicorn", "TREES", "18.1")

【问题讨论】:

  • 字符顺序重要吗?或者您想按字母顺序对它们进行排序?即如果有OG和AB,你要AB, OG吗?
  • 嗨@user2100721,谢谢,但另一个答案不是我想要的。排序是任意的,不是按字典顺序排列的。在这种情况下,它很复杂,因为我无法更改标签。

标签: r vector dataframe


【解决方案1】:

您可以使用factor 变量调整顺序,如下所示:

DATA$This <- factor(DATA$This, levels=c("60", "90", "120", "OG"))

请注意,这不会更改标签值:

DATA
  This That
1  120  453
2   60  679
3   90   12
4   OG  252

但它会更改映射到这些标签的基础整数,以便您可以根据需要对数据进行排序:

DATA[order(DATA$This),]
  This That
2   60  679
3   90   12
1  120  453
4   OG  252

【讨论】:

  • 谢谢@lmo,这正是我正在寻找的东西。我没有意识到这将是一个两步的过程,在第一阶段没有像我预期的那样改变它之后,我感到气馁。
【解决方案2】:

这是对混合类型列进行排序的选项,我们首先将列转换为数字并排序,以确保数字值始终位于字符值的前面,并且按其自然顺序,然后按字符类型排序确保字符值按字母顺序排列,假设 This 列已经属于 character 类:

library(dplyr)
DATA %>% arrange(as.numeric(This), as.character(This))
#   This That
# 1   60  679
# 2   90   12
# 3  120  453
# 4   OG  252

【讨论】:

  • 谢谢@Psidom。目前我仍然对 dplyr 有点不确定,这就是我选择其他答案的原因。但我可以看到它在不同的环境中会很有帮助。
猜你喜欢
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2020-08-29
  • 2020-04-27
  • 2021-02-05
相关资源
最近更新 更多