2016-06-30 5 views
0

セクタsecとサブセクタssecに従ってデータx(ここでは1:12)をソートしたいと思います。以下は、これをどのように行うことができるかを示す例です。疑問はこれがより優雅に(多分ベースRの機能/追加のパッケージを使用しないで)行うことができるかどうかです? base Rからセクタとサブセクタに応じてデータを並べ替える方法は?

## Data 
set.seed(17) 
(sec <- sample(rep(LETTERS[1:3], each = 4))) # 3 sectors 
(ssec <- rep(sample(1:4, 12, replace = TRUE))) # 4 subsectors 
x <- 1:12 # data to sort according to increasing sectors and subsectors 

## Sort according to sectors 
ord <- order(sec) 
x. <- x[ord] 
sec. <- sec[ord] 
ssec. <- ssec[ord] 

## Sort according to subsectors 
usec. <- unique(sec.) 
x.. <- x. 
ssec.. <- ssec. 
for(grp in usec.) { 
    ii <- sec. == grp # indices of components in that sector 
    ord. <- order(ssec.[ii]) 
    x..[ii] <- x.[ii][ord.] 
    ssec..[ii] <- ssec.[ii][ord.] 
} 

## Result 
x.. 
sec. 
ssec.. 
+0

複数の変数を渡して、 'order()'関数にソートすることができます。例えば。 'x [order(sec、ssec)]'、これはあなたが必要とするものですか? – Psidom

+0

* Argh *、true ...非常に良い、ありがとう!私は数年前にそれを使い、それから忘れてしまったと思います...もっと洗練された解決策があると感じました:-)もう一度おねがいします。 –

+0

@Psidom、それを正式な答えにしてみませんか? – gung

答えて

1

order機能はまた、複数の引数を受け付けます。 ?orderから:

orderさらに引数によって絆を壊し、 昇順または降順にその最初の引数を再配置順列を返します。

たちは、元 secssec order(sec, ssec)ソートが部門とサブセクターここ

がどのように確認することができ、証明するために:

sec 
[1] "B" "C" "A" "B" "A" "B" "C" "C" "C" "A" "B" "A" 
ssec 
[1] 3 1 3 2 1 2 4 1 3 2 1 4 

順序付けされたインデックスを適用した後、秒はアルファベットとSSECソートされインデックスorder(sec, ssec)ソートインデックスが期待されている意味し、各秒以内にソートされ:

sec[order(sec, ssec)] 
[1] "A" "A" "A" "A" "B" "B" "B" "B" "C" "C" "C" "C" 
ssec[order(sec, ssec)] 
[1] 1 2 3 4 1 2 2 3 1 1 3 4 
関連する問題