如果我有这个矩阵(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',我将不得不选择下一个最高点。如果不清楚,请告诉我。
我的脑袋希望使用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列,所以我只能做两次这样的序列。
答案 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"