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

对于每一行,我可以得到两个最低列的:

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)

我怎样才能像以前一样为每列获取最低mat2的两行,但忽略我已经从中选择的列mat

例如,如果mat2在行的最高列中,5cols 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并且每行最低列的选择将取决于选择matmat2组合,因此忽略已经选择的所有行matmat2继续几个垫子。

显然在这种情况下只有 4 列,所以我只能执行此序列两次。

4

1 回答 1

0

可能有点复杂,但可以完成工作。我使用更简单的矩阵来演示发生了什么..

> mat1 <- matrix(c(1,2,3,4,4,3,2,1), nrow=2 , byrow=T)

> mat2 <- matrix(c(5,6,7,8,8,7,6,5), nrow=2 , byrow=T)

> colnames(mat1) <- c("A", "B", "C", "D")

> colnames(mat2) <- c("A", "B", "C", "D")

> mat1
     A B C D
[1,] 1 2 3 4
[2,] 4 3 2 1

> mat2 
     A B C D
[1,] 5 6 7 8
[2,] 8 7 6 5

> mymax <- function(x) {
+     names(  x[order(x)]  )[1:2] 
+ }

> mymax2 <- function(x,y) {
+     z <- names(  x[order(x)]  )
+     z[!z %in% y][1:2] 
+ }

> namesmat <- t(apply(mat1, 1, mymax))

> namesmat
     [,1] [,2]
[1,] "A"  "B" 
[2,] "D"  "C" 

> namesmat2 <- t(sapply(1:nrow(mat2), function(i) mymax2(mat2[i,], namesmat[i,])))

> namesmat2
     [,1] [,2]
[1,] "C"  "D" 
[2,] "B"  "A" 
于 2013-02-14T10:42:27.643 回答