1

論理行列を使用して、数値行列内の対応する要素のインデックスを選択して順序付けしています(どちらも同じ次元です)。例えば、

 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
4

2 に答える 2

1

NAを含むマトリックス構造を維持したい理由がわかりません。リストのリストを使用できませんでしたか? その場合、行列をデータ フレームに変換して mapply を使用できます。これが、R で各列に対して個別に関数を実行する方法です。

my.order <- function(x, y) order(y[x],decreasing=TRUE)
mapply(my.order, as.data.frame(x), as.data.frame(y))

$V1
[1] 5 1 4 3 2 6

$V2
[1] 2 6 1 4 7 5 3

$V3
[1] 4 1 2 7 5 6 3

本当に必要な場合は、いつでも各要素をパディングして、リストをデータ フレームに強制することができます。

于 2012-12-21T03:26:19.210 に答える
0

y[x]戻り値

[1]  8  5  1  4 12  7 17  3 14 15 10 13 20 18  2 11  6  9 19 16

これは数値ベクトルです。

order(y[x])したがって、数値ベクトルに取り組んでいます。y行列であった記憶がなくx、列ごとに適用する必要があり、かつては 3 列だった行列に値をパディングする必要があることを理解する能力がありませんNA

リストを使用is.na<-して返すことができます(これを書いているときに投稿された回答に似ています)

newy <- y

is.na(newy) <- !x

apply(newy, 2,function(x) order(na.omit(x), 減少 = TRUE))

[[1]]
[1] 5 1 4 3 2 6

[[2]]
[1] 2 6 1 4 7 5 3

[[3]]
[1] 4 1 2 7 5 6 3
于 2012-12-21T03:30:26.757 に答える