我需要从存储在其他几个矩阵中的数据构建一个矩阵,这些矩阵在第一列中都有一个指针。这就是原始矩阵的外观,其中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
中有多少个矩阵。
答案 0 :(得分:2)
我们可以使用Reduce
包中的merge
和base
合并列表中的所有矩阵。
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创建