【问题标题】:R: Generate matrix with list of matrices of different sizeR:生成具有不同大小矩阵列表的矩阵
【发布时间】:2019-01-14 16:54:22
【问题描述】:

我有一个包含 1,000 个矩阵的列表,它们的前两个元素是:

> 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 列和 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])  

但它不返回矩阵。 任何帮助都将受到欢迎。

【问题讨论】:

    标签: r list matrix


    【解决方案1】:

    我们可以通过listrow.namesmatricesmerge。使用all = TRUE,如果matrix中缺少行名之一,它将默认创建NA

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

    数据

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

    【讨论】:

    • 我试过了,但是没有用。至少第一行代码运行了一段时间没有完成。我在下面找到了一个更简单的解决方案。无论如何感谢您的宝贵时间。
    • @JABalbuena。这取决于数据集的大小。如果对于 1000 个元素来说真的很大,那将需要一些时间
    【解决方案2】:

    我找到了一个非常简单的解决方案。首先,我修改了我的函数以生成按 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 和 row 名称的字母顺序排列。现在我用一个循环来填充NA矩阵:

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

    完成!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      相关资源
      最近更新 更多