Search code examples
rsortingcategories

Custom sorting (non-alphabetical)


I have a categorical data set that looks similar to:

A < -data.frame(animal = c("cat","cat","cat","dog","dog","dog","elephant","elephant","elephant"),
                color = c(rep(c("blue","red","green"), 3)))

    animal color
1      cat  blue
2      cat   red
3      cat green
4      dog  blue
5      dog   red
6      dog green
7 elephant  blue
8 elephant   red
9 elephant green

I want to order it so that 'animal' is sorted as dog < elephant < cat, and then the color is sorted green < blue < red. So in the end it would look like

#     animal color
# 6      dog green
# 4      dog  blue
# 5      dog   red
# 9 elephant green
# 7 elephant  blue
# 8 elephant   red
# 3      cat green
# 1      cat  blue
# 2      cat   red

Solution

  • The levels should be specified explicitly:

    A$animal <- factor(A$animal, levels = c("dog", "elephant","cat"))
    A$color <- factor(A$color, levels = c("green", "blue", "red"))
    

    Then you order by the 2 columns simultaneously:

    A[order(A$animal,A$color),]
    
    # animal color
    # 6      dog green
    # 4      dog  blue
    # 5      dog   red
    # 9 elephant green
    # 7 elephant  blue
    # 8 elephant   red
    # 3      cat green
    # 1      cat  blue
    # 2      cat   red