R-使用链接信息从其他矩阵构建矩阵

时间:2019-06-05 19:42:37

标签: r algorithm list matrix merge

我需要从存储在其他几个矩阵中的数据构建一个矩阵,这些矩阵在第一列中都有一个指针。这就是原始矩阵的外观,其中a-e是连接所有矩阵的数据的指针,而v-z是链接在一起的数据。箭头指向我希望我的最终矩阵看起来像什么。

 a  x   x
 b  y   y
 c  z   z
 d  w   w           
 e  v   v           

 e  v   v          
 d  w   w          
 c  z   z
 b  y   y
 a  x   x

----->

x x x x
y y y y 
z z z z
w w w w
v v v v

我似乎无法编写正确的算法来执行此操作,我遇到了subscript out of bounds错误或replacement has length zero错误。这是我现在所拥有的,但无法正常工作。

for(i in 1:length(matlist)){
tempmatrix = matlist[[i]]                  # list of matrices to be combined 

genMatrix[1,i] = tempmatrix[1,2]
for(j in 2:length(tempmatrix[,1])){
  index = which(indexv == tempmatrix[j,1]) #the row index for the data that needs to be match 
                                            # with an ECID
  for(k in 1:length(tempmatrix[1,])){


    genMatrix[index,k+i] = tempmatrix[j,k]
  }
                # places the data in same row as the ecid

}

}
 print(genMatrix)

编辑:我只想澄清一下,我的示例仅显示了两个矩阵,但是在列表matlist中可以有任意数量的矩阵。我需要找到一种合并它们的方法,而不必知道当时matlist中有多少个矩阵。

1 个答案:

答案 0 :(得分:2)

我们可以使用Reduce包中的mergebase合并列表中的所有矩阵。

as.matrix(read.table(text="a  x   x
                           b  y   y
                           c  z   z
                           d  w   w
                           e  v   v")) -> mat1

as.matrix(read.table(text="e  v   v
                           d  w   w
                           c  z   z
                           b  y   y
                           a  x   x")) -> mat2

as.matrix(read.table(text="e  x   z
                           d  z   w
                           c  w   v
                           b  y   x
                           a  v   y")) -> mat3


matlist <- list(mat1=mat1, mat2=mat2, mat3=mat3)


Reduce(function(m1, m2) merge(m1, m2, by = "V1", all.x = TRUE),
       matlist)[,-1]

#>   V2.x V3.x V2.y V3.y V2 V3
#> 1    x    x    x    x  v  y
#> 2    y    y    y    y  y  x
#> 3    z    z    z    z  w  v
#> 4    w    w    w    w  z  w
#> 5    v    v    v    v  x  z

reprex package(v0.3.0)于2019-06-05创建

或者我们可以将所有矩阵附加在一起,然后使用tidyr从长到宽得到所需的输出。

library(tidyr)
library(dplyr)

bind_rows(lapply(matlist, as.data.frame), .id = "mat") %>%   
  gather(matkey, val, c("V2","V3")) %>% 
  unite(matkeyt, mat, matkey, sep = ".") %>% 
  spread(matkeyt, val) %>% 
  select(-V1)

#>   mat1.V2 mat1.V3 mat2.V2 mat2.V3 mat3.V2 mat3.V3
#> 1       x       x       x       x       v       y
#> 2       y       y       y       y       y       x
#> 3       z       z       z       z       w       v
#> 4       w       w       w       w       z       w
#> 5       v       v       v       v       x       z

reprex package(v0.3.0)于2019-06-06创建