自定义排序(非字母顺序)

37

我有一个类别数据集,长得像这样:

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

我希望将'animal'的排序顺序设为dog < elephant < cat,然后按颜色排序为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
4个回答

50

应该明确指定级别:

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

16

您还可以使用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

4

值得注意的另一件事是 - 您不必转换类来完成此操作。您可以仅按变量的因子排序。因此,如果需要,在现有数据结构中保留字符类。

例如,使用上面的示例:

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

这取决于类的保存是否很重要。对我个人来说,这将是一个更典型的用例。希望能有所帮助。


0

agstudy类似,我将介绍“整洁宇宙”呈现排序的方式:

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

然后我们加载 dplyr 或整个 tidyverse ,就可以进行操作了

arrange(A, animal, color)

或者简单地说

A %>% arrange(animal, color)

其中%>%是r语言中的“管道”操作符,可以通过使用Ctrl+Shift+m进行访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接