R:使用不同大小的矩阵列表生成矩阵

R:使用不同大小的矩阵列表生成矩阵,r,list,matrix,R,List,Matrix,我有一个1000个矩阵的列表,其前两个元素是: > Bpam[1:2] [[1]] cluster sil_width D.var 1 0.7445190 Hy.adu 1 0.7233527 A.cra 0 0.8563551 Cu.cir 0 0.8483707 Sp.sp 0 0.8461553 E.gad 0 0.8368920 L.elo 0 0.8341050 A.mor

我有一个1000个矩阵的列表,其前两个元素是:

> Bpam[1:2]
[[1]]
       cluster sil_width
D.var        1 0.7445190
Hy.adu       1 0.7233527
A.cra        0 0.8563551
Cu.cir       0 0.8483707
Sp.sp        0 0.8461553
E.gad        0 0.8368920
L.elo        0 0.8341050
A.mor        0 0.8219688
H.com        0 0.7046171
S.cad        0 0.5731629

[[2]]
       cluster sil_width
Hy.adu       1 0.5518385
D.var        1 0.1878755
Ab.gad       0 0.8183177
L.elo        0 0.7964595
A.cra        0 0.7964595
Cu.cir       0 0.7879583
A.mor        0 0.7667134
S.cad        0 0.5821773
H.com        0 0.5644358
请注意,行数不同(“Sp.Sp”在Bpam[[2]]中不存在。我想创建一个包含n列和1000行的矩阵(其中n是列表中不同行名的总数),以保存列表中每个矩阵的变量集群,如果缺少一行,则保存NAs。 我试过了


NA.matrix我们可以通过
矩阵
列表的
行名
进行
合并
。使用
all=TRUE
,如果
矩阵中缺少一个行名,它将默认创建
NA

out <- Reduce(function(...) merge(..., by = "row.names", all = TRUE), Bpam)
row.names(out) <- out$Row.names
out <- out[, -1]

out我找到了一个非常简单的解决方案。首先,我修改了我的函数以生成按行字母顺序排列的矩阵列表。名称:

> Bpam[1:2]
[[1]]
       cluster  sil_width
A.cra        0 0.81960918
A.mor        0 0.83767035
Cu.cir       0 0.82537241
D.var        0 0.05898329
H.com        0 0.55435303
Hy.adu       1 0.00000000
L.elo        0 0.83984674
S.cad        0 0.81047726
Sp.sp        0 0.80335860

[[2]]
       cluster  sil_width
A.cra        0 0.85243545
A.mor        0 0.88501435
Cu.cir       0 0.87372261
D.var        0 0.02317251
E.gad        0 0.85797643
H.com        0 0.89236411
Hy.adu       1 0.00000000
S.cad        0 0.88181818
Sp.sp        0 0.88836713
然后


NA.matrix我试过了,但没有成功。至少第一行代码运行了一段时间没有完成。我找到了一个更简单的解决方案,发布在下面。无论如何感谢您的时间。@JABalbuena。这取决于数据集的大小。如果它真的能容纳1000个元素,那就需要一些时间了
Bpam <- list(structure(c(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0.744519, 0.7233527, 
0.8563551, 0.8483707, 0.8461553, 0.836892, 0.834105, 0.8219688, 
0.7046171, 0.5731629), .Dim = c(10L, 2L), .Dimnames = list(c("D.var", 
"Hy.adu", "A.cra", "Cu.cir", "Sp.sp", "E.gad", "L.elo", "A.mor", 
"H.com", "S.cad"), c("cluster", "sil_width"))), structure(c(1, 
1, 0, 0, 0, 0, 0, 0, 0.5518385, 0.1878755, 0.8183177, 0.7964595, 
0.7964595, 0.7879583, 0.7667134, 0.5821773), .Dim = c(8L, 2L), .Dimnames = list(
    c("Hy.adu", "D.var", "Ab.gad", "L.elo", "A.cra", "Cu.cir", 
    "A.mor", "S.cad"), c("cluster", "sil_width"))))
> Bpam[1:2]
[[1]]
       cluster  sil_width
A.cra        0 0.81960918
A.mor        0 0.83767035
Cu.cir       0 0.82537241
D.var        0 0.05898329
H.com        0 0.55435303
Hy.adu       1 0.00000000
L.elo        0 0.83984674
S.cad        0 0.81047726
Sp.sp        0 0.80335860

[[2]]
       cluster  sil_width
A.cra        0 0.85243545
A.mor        0 0.88501435
Cu.cir       0 0.87372261
D.var        0 0.02317251
E.gad        0 0.85797643
H.com        0 0.89236411
Hy.adu       1 0.00000000
S.cad        0 0.88181818
Sp.sp        0 0.88836713
NA.matrix <- matrix(rep(NA, n*length(Bpam)), length(Bpam), n)
colnames(NA.matrix) <- sort(A)
for (i in 1:length(Bpam)) {
  NA.matrix[i, which(colnames(NA.matrix) %in% rownames(Bpam[[i]]))] <- Bpam[[i]][,1] 
  }