我有两个具有相同行数和列数的矩阵,我想通过它们的索引合并它们以便创建一个新矩阵(我不知道nrow()和ncol()提前,nrow()来自k kmeans cluster centroid和ncol()来自k'knn值)
A <- matrix(sample(letters), ncol = 10, nrow = 3)
B <- matrix(sample(letters), ncol = 10, nrow = 3)
一个
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "h" "p" "j" "w" "z" "e" "q" "o" "s" "y"
[2,] "y" "b" "k" "t" "a" "v" "f" "x" "c" "r"
[3,] "r" "i" "m" "g" "d" "n" "l" "u" "h" "p"
乙
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "k" "q" "l" "n" "o" "r" "u" "b" "s" "y"
[2,] "y" "f" "v" "c" "t" "w" "h" "a" "d" "x"
[3,] "x" "e" "j" "g" "m" "i" "p" "z" "k" "q"
我找到他们的索引:
a <- which(A !=0, arr.ind = T)
b <- which(B !=0, arr.ind = T)
我想要一个按行和列索引合并A和B的最终矩阵,这样A [1,1]就在B [1,1]之前 .
A[1,1] B[1,1] A[1,2] B[1,2] A[1,3] B[1,3] A[1,4] B[1,4] ...
A[2,1] B[2,1] A[2,2]] B[2,2] A[2,3] B[2,3] A[2,4] B[2,4] ...
A[3,1] B[3,1] A[3,2] B[3,2] A[3,3] B[3,3] A[3,4] B[3,4] ...
所以例如第一行是:
h k p q j l w n z o
我发现here lapply函数完成了这项工作,但它给了我一个列表:
t <- lapply(1:length(knn.mat),
function(i){cbind(A[i], B[i])})
我不能单独取消列表,因为我事先并不知道输入矩阵将包含多少行和列,我希望矩阵或数据帧作为输出,也许是带有for循环的东西,我可以使用函数申请家庭? (这个运行不好)
doMat <- function(x,y){
X <- matrix(0, nrow = nrow(x), ncol = ncol(x)*2)
for (i in 1:nrow(x))
{
X[i] <- cbind(x[i],y[i])
i = i+1
}
return(X)}
3 回答
这将在一行中完成 - 利用R可以将矩阵视为向量的方式 .
另一个拿:)
如果您要尝试的只是交织列,那么您可以使用与此问题类似的方法:Alternate, interweave or interlace two vectors
这似乎有效:
matrix(c(rbind(A,B)), nrow = nrow(A))
Edit:
正如@Moody_Mudskipper在评论中指出的那样,
c()
在这种情况下实际上是多余的:matrix(rbind(A,B), nrow = nrow(A))
也可以正常工作 .