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

Arranging rows in custom order using dplyr [duplicate]

提问人:MYaseen208 提问时间:9/9/2017 最后编辑:HoboMYaseen208 更新时间:5/14/2022 访问量:92346

问:

有了函数,我们可以按升序或降序排列行。想知道如何按自定义顺序排列行。请参阅 MWE。arrangedplyr

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
r dplyr 数据操作

评论


答:

139赞 akrun 9/9/2017 #1

我们可以用来以自定义方式更改factororder

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

或者用 获取索引 并在其上matcharrange

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

评论

2赞 MYaseen208 9/9/2017
感谢@akrun提供很好的解决方案。是否有任何变量可以在不输入其名称的情况下用于所有剩余的变量?谢谢desc
0赞 akrun 9/9/2017
@MYaseen208 感谢您的留言。我添加了另一个选项。希望对您有所帮助
0赞 jzadra 2/23/2018
是的,为了回应@MYaseen208,有没有办法选择一对夫妇在底部,但其余的在顶部?例如,如果我有 20 个变量,并且我希望其中 2 个在底部,那么这种方法似乎只有在我命名比赛中的前 18 个变量时才有效。无论我使用什么 desc() 和 !match,我总是在底部获得未命名的值。
1赞 1/14/2019
给未来观众的旁注:第一个解决方案可以缩短为df %>% arrange(factor(Reg, levels = LETTERS[c(3,1,2)]))
2赞 Fons MA 4/8/2019
似乎如果排序变量已经被定义为 之外的有序因子,那么 的行为仍然是按字母顺序排序......怎么会这样?arrangearrange
4赞 dondapati 9/9/2017 #2

使用 data.table

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

这里 df1 是 data.table

14赞 Peter Dorey 12/17/2020 #3

我使用了slice()函数:

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

评论

1赞 Markm0705 5/19/2022
我发现这是最简单和最容易遵循的答案,但发现我可以使用 %>% 而不是 %<>%