Arranging rows in custom order in R

Viewed 25

I have data as follows which I want to custom order/arrange:

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

I want the Desired Output in the alternating order of each C,A,B and descending order of Pop.

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

Here's one way to do this -

Arrange the data in descending order of pop, create a row id column for each Reg and use it in arrange function.

library(dplyr)

cust_order <- c('C', 'A', 'B')

df %>%
  arrange(desc(Pop)) %>%
  mutate(ord = data.table::rowid(Reg)) %>%
  arrange(ord, match(Reg, cust_order)) %>%
  select(-ord)

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