Arranging rows in custom order using dplyr

RDplyrData Manipulation

R Problem Overview


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

R Solutions


Solution 1 - R

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

Solution 2 - R

I used the slice() function:

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

Solution 3 - R

using data.table

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

Here df1 is data.table

Solution 4 - R

For the selected answer above, %in% can be used as an alternative to match.

%in% is a more intuitive interface as a binary operator, which returns a logical vector indicating if there is a match or not for its left operand.

Usage

match(x, table, nomatch = NA_integer_, incomparables = NULL)

x %in% table

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMYaseen208View Question on Stackoverflow
Solution 1 - RakrunView Answer on Stackoverflow
Solution 2 - RPeter DoreyView Answer on Stackoverflow
Solution 3 - RdondapatiView Answer on Stackoverflow
Solution 4 - RNovaView Answer on Stackoverflow