使用两个矩阵选择行最低值

时间:2013-02-14 08:59:16

标签: r

如果我有这个矩阵(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中选择的列。

E.g。如果在mat2中,行5的最高列为cols 3 & 1,但必须选择最高的列。如果下一个最高点是'col 2',我将不得不选择下一个最高点。如果不清楚,请告诉我。

我的脑袋希望使用mat2namesmat进行某种类似的申请:

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

我会在很多垫子上这样做。 mat2选择取决于mat选择。然后我会有一个mat3,每行选择最低的列将取决于matmat2合并的选择,因此忽略已为mat选择的所有行和mat2继续使用几个垫子。

显然在这种情况下只有4列,所以我只能做两次这样的序列。

1 个答案:

答案 0 :(得分: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"