MYaseen208
MYaseen208

Reputation: 23948

Arranging rows in custom order using dplyr

With arrange function in dplyr, we can arrange row in ascending or descending order. Wonder how to arrange rows in custom order. Please see 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()

Desired Output

   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

Upvotes: 86

Views: 106905

Answers (3)

Peter Dorey
Peter Dorey

Reputation: 171

I used the slice() function:

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

Upvotes: 17

dondapati
dondapati

Reputation: 849

using data.table

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

Here df1 is data.table

Upvotes: 6

akrun
akrun

Reputation: 887961

We can use factor to change the order in a custom way

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

Or with match to get the index and arrange on it

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

If we have multiple columns to arrange in descending order

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

Upvotes: 146

Related Questions