0

私は2つの行列を持っています:

matrix1:

     col1   col2
row1  5      4

row2  4      6




matrix2:

     col1   col2
row1  48     50

row2  47     46

私が欲しいのは、新しいマトリックスまたはテーブルです:

          Dim1   Dim2   rank
row2col1   4      47     1
row1col2   4      50     2
row1col1   5      48     3
row2col2   6      46     4

ご覧のとおり、行と列のさまざまな組み合わせを最初に dim1 に基づいてランク付けし、同点の場合は dim2 を使用してランク付けします。結果の行列は、このランクを使用して並べ替える必要があります。どうすれば達成できますか?matrix1 と 2 には、dim1 と dim2 の値が含まれており、列と行の名前がまったく同じであることに注意してください。

4

2 に答える 2

4

重複する行がないと仮定します。

a <- array(c(5,4,4,6,48,47,50,46),c(2,2,2))
dimnames(a) <- list(c("row1", "row2"), c("col1", "col2"), c("m1", "m2"))
# , , m1
# 
# col1 col2
# row1    5    4
# row2    4    6
# 
# , , m2
# 
# col1 col2
# row1   48   50
# row2   47   46

library(reshape2)
b <- acast(melt(a), Var1+Var2~Var3)
b <- b[order(b[,1], b[,2]),]

または、任意の数の列の場合:

b <- b[do.call(order, lapply(seq_len(ncol(b)), function(i) b[,i])),]
#add ranks
b <- cbind(b, rank=seq_len(nrow(b)))

#           m1 m2 rank
# row2_col1  4 47    1
# row1_col2  4 50    2
# row1_col1  5 48    3
# row2_col2  6 46    4
于 2013-11-14T15:10:13.447 に答える