Пользовательская сортировка по 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