R中的自定义排序

问题描述 投票:18回答:3

我有一个类似于以下内容的分类数据集:

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

我想订购它,以便动物用狗,然后大象,然后猫,然后颜色分为绿色,蓝色,然后红色。所以最后它看起来像

狗绿色,狗蓝色,狗红色,大象绿色,大象蓝色,...

r sorting categories
3个回答
37
投票

应明确指定级别:

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

然后您同时按2列排序:

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

2
投票

另一件值得注意的事情 - 您不必转换类来执行此操作。您可以简单地按变量因子排序。因此,如果需要,保留现有数据结构内的例如字符类。

例如,使用上面的例子:

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

取决于课堂保护是否重要。对我个人而言,这将是一个更典型的用例。 HTH


2
投票

你也可以使用match - 你不改变列类也不做factor转换。

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

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
© www.soinside.com 2019 - 2024. All rights reserved.