Пользовательская сортировка по R
У меня есть категориальный набор данных, который похож на:
A<-data.frame(animal=c("cat","cat","cat","dog","dog","dog","elephant","elephant","elephant"),
color =c(rep(c("blue","red","green"),3)))
Я хочу заказать его так, чтобы животное сортировалось с собакой, потом слоном, потом кошкой, а затем цвет сортировал зеленый, синий, затем красный. Поэтому, в конце концов, это будет выглядеть как
собака зеленая,
собака голубая,
собака красная,
слон зеленый,
слон синий,
...
Ответы
Ответ 1
Уровни должны быть указаны явно:
A$animal <- factor(A$animal, levels = c("dog", "elephant","cat"))
A$color <- factor(A$color, levels = c("green", "blue", "red"))
Затем вы заказываете двумя столбцами одновременно:
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"))),]
Зависит от важности сохранения класса. Это было бы гораздо более типичным вариантом использования лично для меня. НТН
Ответ 3
Вы также можете использовать 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