This question already has answers here:

How to join (merge) data frames (inner, outer, left, right)
(13个答案)
Simultaneously merge multiple data.frames in a list
(8个答案)
我需要从存储在其他几个矩阵中的数据构建一个矩阵,这些矩阵的第一列都有一个指针这就是原始矩阵的外观,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中有多少矩阵。

最佳答案

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

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

于2019-06-05由reprex package(v0.3.0)创建
或者我们可以将所有矩阵附加在一起,然后使用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

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

关于r - R-从具有链接信息的其他矩阵构建矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56466995/

10-14 16:00
查看更多