0

この行列 ( mat) がある場合:

set.seed(140213)
mat <- matrix(runif(16,0,1),nrow = 4)
colnames(mat) <- 1:4
rownames(mat) <- 5:8
#> mat
#          1          2         3         4
#5 0.1120015 0.01454408 0.3411633 0.3456254
#6 0.5709174 0.70443202 0.9114756 0.9157580
#7 0.1500032 0.40889119 0.6231543 0.9736331
#8 0.9773827 0.45136413 0.9706694 0.5022132

行ごとに、次のように使用して、最下位の 2 つの列を取得できます。

namesmat <- t(apply(mat, 1, function(x)
                            head(names(x)[order(x, decreasing = FALSE)], 2)))

#  [,1] [,2]
#5 "2"  "1" 
#6 "1"  "2" 
#7 "1"  "2" 
#8 "2"  "4" 

今私の質問は:

別の行列がある場合 ( mat2)

 set.seed(14022013) ; mat2 <- matrix(runif(16,0,1),nrow = 4)

前に行ったように、各列の最下位の 2 行を取得するにはどうすればよいですか。mat2ただし、既に選択した列は無視しますmat

たとえばmat2、行の最上位の列にある5場合はcols 3 & 1、ネストされた最上位を選択する必要があります。次に高い値が「col 2」である場合、次に高い値を選択する必要があります。これが不明な場合はお知らせください。

mat2私の頭は、次のnamesmatようなものを使用して、ある種の適用を適用したいと考えています。

 t(apply(mat, 1, function(x) head(
     names(x)[order(x[! names(x) == apply(namesmat,1,c)] ,
         decreasing = FALSE)], 2)))

そのため、これを多くのマットで行います。mat2選択は選択に依存しmatます。次に、mat3行ごとの最下位の列の選択は、結合された選択に依存するmatためmat2、すでに選択されているすべての行を無視して、いくつかのマットmatを続行します。mat2

明らかにこの場合、列は 4 つしかないため、このシーケンスは 2 回しか実行できません。

4

1 に答える 1