R:生成具有不同大小的矩阵列表的矩阵

时间:2019-01-14 16:54:23

标签: 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        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

请注意,行数有所不同(Bpam [[2]]中不存在“ Sp.sp”。我想创建一个n列和1,000行的矩阵(其中n是整个不同行名的总数列表)以将每个矩阵的变量簇保存在列表中,如果缺少某一行,则保存NA。 我尝试过

NA.matrix <- matrix(rep(NA, n*length(Bpam)), length(Bpam), n)
colnames(NA.matrix) <- A # char vector with names in n
# 
clus.memb.p <- sapply(1:length(Bpam), function(x) 
               NA.matrix[x, which(colnames(NA.matrix) %in% rownames(Bpam[[x]]))] 
               <- Bpam[[x]][,1])  

,但不返回矩阵。 任何帮助将是最欢迎的。

2 个答案:

答案 0 :(得分:1)

我们可以merge的{​​{1}}的{​​{1}} row.names。使用list,如果matrices

中缺少行名之一,它将默认创建all = TRUE
NA

数据

matrix

答案 1 :(得分:0)

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

> 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)

因此,列表中的NA矩阵和元素都分别按col和行名按字母顺序排列。现在,我使用循环来填充NA矩阵:

for (i in 1:length(Bpam)) {
  NA.matrix[i, which(colnames(NA.matrix) %in% rownames(Bpam[[i]]))] <- Bpam[[i]][,1] 
  }

完成!