使用 dplyr 按自定义顺序排列行

Posted

技术标签:

【中文标题】使用 dplyr 按自定义顺序排列行【英文标题】:Arranging rows in custom order using dplyr 【发布时间】:2018-02-18 03:19:10 【问题描述】:

通过dplyr 中的arrange 函数,我们可以按升序或降序排列行。想知道如何按自定义顺序排列行。请参阅 MWE。

Reg <- rep(LETTERS[1:3], each = 2)
Res <- rep(c("Urban", "Rural"), times = 3)
set.seed(12345)
Pop <- rpois(n = 6, lambda = 500000)
df <- data.frame(Reg, Res, Pop)

df
   Reg   Res    Pop
1    A Urban 500414
2    A Rural 500501
3    B Urban 499922
4    B Rural 500016
5    C Urban 501638
6    C Rural 499274

df %>%
  arrange()

期望的输出

   Reg   Res    Pop
5    C Urban 501638
6    C Rural 499274
1    A Urban 500414
2    A Rural 500501
3    B Urban 499922
4    B Rural 500016

【问题讨论】:

【参考方案1】:

我使用了 slice() 函数:

   df %<>%
   slice(5,6,1:4)

【讨论】:

【参考方案2】:

使用 data.table

df1[order(factor(Reg,levels = LETTERS[c(3,1,2)]))]

这里df1是data.table

【讨论】:

【参考方案3】:

我们可以使用factor以自定义方式更改order

df %>%
    arrange(factor(Reg, levels = LETTERS[c(3, 1, 2)]), desc(Res), desc(Pop))
#  Reg   Res    Pop
#1   C Urban 501638
#2   C Rural 499274
#3   A Urban 500414
#4   A Rural 500501
#5   B Urban 499922
#6   B Rural 500016

或者用match获取索引和arrange就可以了

df %>%
    arrange(match(Reg, c("C", "A", "B")), desc(Res), desc(Pop))

如果我们有多个列到arrange,按降序排列

df %>%
     arrange_at(2:3, desc) %>%
     arrange(match(Reg, c("C", "A", "B")))

【讨论】:

感谢@akrun 提供了很好的解决方案。是否有任何方法可以在不输入名称的情况下对所有剩余变量使用desc?谢谢 @MYaseen208 感谢您的来信。我添加了另一个选项。希望对你有帮助 是的,为了呼应@MYaseen208,有没有办法选择一对放在底部,而其余的放在顶部?例如,如果我有 20 个变量,并且我想要其中 2 个在底部,那么这种方法似乎只有在我命名匹配中的前 18 个时才有效。不管我使用什么 desc() 和 !match,我总是在底部得到未命名的值。 对未来观众的补充说明:第一个解决方案可以缩短为df %&gt;% arrange(factor(Reg, levels = LETTERS[c(3,1,2)])) 看来,如果排序变量已经被定义为arrange之外的有序因子,那么arrange的行为仍然是按字母顺序排列的……怎么会?

以上是关于使用 dplyr 按自定义顺序排列行的主要内容,如果未能解决你的问题,请参考以下文章

python按自定义顺序排序字典列表[重复]

在 Eloquent 中按自定义顺序对集合进行排序 [重复]

WP 按自定义元键归档顺序

按自定义顺序排序列表

按自定义顺序对数组的php数组进行排序

如何按自定义顺序对 JavaScript 中的数组进行排序? [复制]