論理行列を使用して、数値行列内の対応する要素のインデックスを選択して順序付けしています(どちらも同じ次元です)。例えば、
x <- c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
y <- c(7, 10, 3, 1, 6, 8, 2, 11, 1, 5)
order(y[x],decreasing=TRUE)
[1] 5 1 4 3 2 6
# NOTE: these are the **indices** of the ordered vector y[x] now containing
# only six elements (10,3,6,8,11,1)
素晴らしい。正常に動作します。ただし、行列に対して操作を実行すると、予期しない結果が得られました。
x <- matrix(rep(c(F,T,T),10), nrow=10)
[,1] [,2] [,3]
[1,] FALSE TRUE TRUE
[2,] TRUE TRUE FALSE
[3,] TRUE FALSE TRUE
[4,] FALSE TRUE TRUE
[5,] TRUE TRUE FALSE
[6,] TRUE FALSE TRUE
[7,] FALSE TRUE TRUE
[8,] TRUE TRUE FALSE
[9,] TRUE FALSE TRUE
[10,] FALSE TRUE TRUE
y <- matrix( round(rnorm(30,sample(10))), ncol=3)
[,1] [,2] [,3]
[1,] 7 7 6
[2,] 10 12 8
[3,] 3 5 6
[4,] 1 1 0
[5,] 6 5 6
[6,] 8 7 7
[7,] 2 3 4
[8,] 11 8 9
[9,] 1 2 1
[10,] 5 5 5
y<-structure(c(7, 10, 3, 1, 6, 8, 2, 11, 1, 5, 7, 12, 5, 1, 5, 7,
3, 8, 2, 5, 6, 8, 6, 0, 6, 7, 4, 9, 1, 5), .Dim = c(10L, 3L))
order(y[x], decreasing=TRUE)
[1] 8 5 1 4 12 7 17 3 14 15 10 13 20 18 2 11 6 9 19 16
比較で長さが等しくないベクトルが返されるため(xの論理TRUEに依存)、意図した操作の動作を破っているようです。でも、
y[x]
[1] 10 3 6 8 11 1 7 12 1 5 3 8 5 6 6 0 7 4 1 5
注文なしで私が期待するものを生み出します。order(y [x])は、すべてのTRUE要素に対して実行されます。これはバグですか?私は(素朴に)それが各列で別々に操作を実行し、上記のように結果を連結することを期待します。
いずれにせよ、非対称の結果を行列に分割する合理的な方法はありますか?各ベクトルにNAを最大dim(x)までパディングしてから、行列にcbindすることを検討しました(以下を参照)。私はベクトル化を失うので、混乱のようです。もっとエレガントなアイデア/ヒントはありますか?
ありがとう。
#Desired result
[,1] [,2] [,3]
[1,] 5 2 4
[2,] 1 6 1
[3,] 4 1 2
[4,] 3 4 7
[5,] 2 7 5
[6,] 6 5 6
[7,] NA 3 3