Custom Sorting in R

2019-02-04 12:36发布

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

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

dog green, dog blue, dog red, elephant green, elephant blue, ...

3条回答
beautiful°
2楼-- · 2019-02-04 12:47

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
查看更多
The star\"
3楼-- · 2019-02-04 12:54

You can also use match - you do not alter column class neither do a factor transformation.

A[order(match(A$animal, c("dog", "elephant","cat")), match(A$color, c("green", "blue", "red"))),]

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
查看更多
小情绪 Triste *
4楼-- · 2019-02-04 13:08

One other thing worth noting - you don't have to convert the class to do this. You can simply order by the factor of the variable. Thus preserving as eg character class within the existing data structure, if that is desired.

so eg, using the example above:

A[order(factor(A$animal, levels = c("dog", "elephant","cat")) ,factor(A$color, levels = c("green", "blue", "red"))),]

Depends on whether conservation of class is important. This would be a much more typical use case for me personally. HTH

查看更多
登录 后发表回答