web-dev-qa-db-ja.com

Rでのカスタムソート

次のようなカテゴリデータセットがあります。

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

動物を犬、象、猫、色の順に緑、青、赤の順に並べたい。したがって、最終的には次のようになります

犬の緑、犬の青、犬の赤、象の緑、象の青、...

23
user3379798

レベルは明示的に指定する必要があります。

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
40
agstudy

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
xm1

もう1つ注目に値すること-これを行うためにクラスを変換する必要はありません。変数の係数で並べ替えることができます。したがって、必要に応じて、たとえば既存のデータ構造内の文字クラスとして保持します。

たとえば、上記の例を使用します。

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

クラスの保全が重要かどうかによって異なります。これは、個人的には私にとってはるかに典型的な使用例です。 HTH

3
Pascoe