【问题标题】:Create homogenous matrices by filling with NaN R通过填充 NaN R 创建同质矩阵
【发布时间】:2023-04-02 19:53:01
【问题描述】:

我有几个矩阵,它们的大小都不同,顺序也略有不同。我正在尝试组织矩阵,以便对它们进行平均。最直接的方法(我认为)是创建相等的矩阵,然后使用之前建议的解决方案之一,例如 Reduce("+", my.list) / length(my.list)

我在想有可能创建一个 10x10 的模板矩阵,然后将每个矩阵应用于模板,这样如果要应用的矩阵不是 10x10(例如,它是 4x4),则矩阵的其余部分将是充满了NaN。我提供了三个示例矩阵和三个我希望输出看起来像的矩阵。

三个样本矩阵:

           0         1  2         3    4 5 6         7   8 9
0  0.7134503 0.0000000  0 0.0000000 0.00 0 0 0.0000000 0.0 0
1  0.6800000 0.0000000  0 0.0000000 0.00 0 0 0.0000000 0.0 0
2  0.2352941 0.2941176  0 0 0.0000000 0.00 0 0.4117647 0.0 0
3  0.3333333 0.0000000  0 0.0000000 0.00 0 0 0.0000000 0.2 0
4  0.0000000 0.0000000  0 0.0000000 0.00 0 0 0.0000000 0.0 0
5  0.5000000 0.0000000  0 0.0000000 0.25 0 0 0.0000000 0.0 0
6  0.6000000 0.4000000  0 0.0000000 0.00 0 0 0.0000000 0.0 0
7  0.5250000 0.0000000  0 0.0000000 0.00 0 0 0.0000000 0.0 0
8  0.6060606 0.0000000  0 0.2121212 0.00 0 0 0.0000000 0.0 0
9  0         0          0 0         0    0 0 0         0   0

          0   1         2         3         4 5 7   8 9
0 0.5550000 0.0 0.0000000 0.2200000 0.0000000 0 0 0.0 0
1 0.6363636 0.0 0.2727273 0.0000000 0.0000000 0 0 0.0 0
2 0.4516129 0.0 0.0000000 0.2580645 0.0000000 0 0 0.0 0
3 0.4150943 0.0 0.0000000 0.3679245 0.0000000 0 0 0.0 0
4 0.7647059 0.0 0.0000000 0.2352941 0.0000000 0 0 0.0 0
5 0.4285714 0.0 0.0000000 0.0000000 0.0000000 0 0 0.0 0
7 0.2000000 0.2 0.2000000 0.2000000 0.0000000 0 0 0.2 0
8 0.3000000 0.0 0.0000000 0.7000000 0.0000000 0 0 0.0 0
9 0.5555556 0.0 0.0000000 0.0000000 0.2222222 0 0 0.0 0

          0 2         3 4 7 8
0 0.4020101 0 0.5075377 0 0 0
2 0.0000000 0 0.0000000 0 0 0
3 0.6322581 0 0.2322581 0 0 0
4 0.0000000 0 0.0000000 0 0 0
7 0.0000000 0 0.0000000 0 0 0
8 0.4883721 0 0.3488372 0 0 0

期望的输出:

           0         1 2  3         4    5 6 7         8   9
0  0.7134503 0.0000000  0 0 0.0000000 0.00 0 0 0.0000000 0.0
1  0.6800000 0.0000000  0 0 0.0000000 0.00 0 0 0.0000000 0.0
2  0.2352941 0.2941176  0 0 0.0000000 0.00 0 0 0.4117647 0.0
3  0.3333333 0.0000000  0 0 0.0000000 0.00 0 0 0.0000000 0.2
4  0.0000000 0.0000000  0 0 0.0000000 0.00 0 0 0.0000000 0.0
5  0.5000000 0.0000000  0 0 0.0000000 0.25 0 0 0.0000000 0.0
6  0.6000000 0.4000000  0 0 0.0000000 0.00 0 0 0.0000000 0.0
7  0.5250000 0.0000000  0 0 0.0000000 0.00 0 0 0.0000000 0.0
8  0.6060606 0.0000000  0 0 0.2121212 0.00 0 0 0.0000000 0.0
9  0.7272727 0.0000000  0 0 0.0000000 0.00 0 0 0.0000000 0.0

          0   1         2         3         4 5 6 7   8 9
0 0.5550000 0.0 0.0000000 0.2200000 0.0000000 0 NA 0.0 0
1 0.6363636 0.0 0.2727273 0.0000000 0.0000000 0 NA 0.0 0
2 0.4516129 0.0 0.0000000 0.2580645 0.0000000 0 NA 0.0 0
3 0.4150943 0.0 0.0000000 0.3679245 0.0000000 0 NA 0.0 0
4 0.7647059 0.0 0.0000000 0.2352941 0.0000000 0 NA 0.0 0
5 0.4285714 0.0 0.0000000 0.0000000 0.0000000 0 NA 0.0 0
6 NA        NA  NA        NA        NA        NANA NA  NA
7 0.2000000 0.2 0.2000000 0.2000000 0.0000000 0 NA 0.2 0
8 0.3000000 0.0 0.0000000 0.7000000 0.0000000 0 NA 0.0 0
9 0         0   0         0         0         0 NA 0   0

          0 1  2         3 4 5 6 7 8 9
0 0.4020101 NA 0 0.5075377 0 NANA0 0 NA
1    NA     NA NA     NA   NANANANANANA  
2 0.0000000 NA 0 0.0000000 0 0 0NANANA
3 0.6322581 NA 0 0.2322581 0 0 0NANANA
4 0.0000000 NA 0 0.0000000 0 0 0NANANA
5     NA    NANA      NA   NANA NA NA NA
6     NA    NANA      NA   NANA NA NA NA
7 0.0000000 NA 0 0.0000000 0 0 0NANANA
8 0.4883721 NA 0 0.3488372 0 0 0NANANA
9     NA    NANA      NA   NANA NA NA NA

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    一种快速方法:获取列表中唯一列和行名的集合。使用这些维度创建一个新矩阵,然后使用子集机制(按行和列名称)来分配值。

    # some dummy data
    m1 <- matrix(1:4, 2, dimnames=list(0:1, c(0,3)))
    m2 <- matrix(1:9, 3, dimnames=list(0:2, 0:2))
    lst <- list(m1, m2)
    #> lst
    #[[1]]
    #  0 3
    #0 1 3
    #1 2 4
    
    #[[2]]
    #  0 1 2
    #0 1 4 7
    #1 2 5 8
    #2 3 6 9
    
    # Get unique col and row names
    nc <- sort(unique(unlist(lapply(lst, colnames))))
    nr <- sort(unique(unlist(lapply(lst, rownames))))
    
    # loop through matrices
    lst2 <- lapply(lst , function(x) {
      out = matrix(NA, ncol=length(nc), nrow=length(nr), dimnames=list(nr, nc))
      idx = as.matrix(expand.grid(rownames(x), colnames(x)))
      out[idx] <- x
      out
      })
    # lst2
    #[[1]]
    #   0  1  2  3
    #0  1 NA NA  3
    #1  2 NA NA  4
    #2 NA NA NA NA
    
    #[[2]]
    #  0 1 2  3
    #0 1 4 7 NA
    #1 2 5 8 NA
    #2 3 6 9 NA
    

    对您使用Reduce("+", my.list) / length(my.list) 的一个评论是,如果有NA,总和不会像(我认为)您期望的那样工作。但是可以通过

    得到它们
    s <- simplify2array(lst2)
    rowMeans(s, dim=2, na.rm = TRUE)
    #  0 1 2   3
    #0 1 4 7   3
    #1 2 5 8   4
    #2 3 6 9 NaN
    

    另一种获取手段的方法

    d <- Reduce(function(...) merge(..., by=c("Var1", "Var2"), all=TRUE), lapply(lst, reshape2::melt))
    v <- rowMeans(d[-(1:2)], na.rm = TRUE)
    xtabs(v ~ Var1 + Var2, data=d)
    #    Var2
    #Var1 0 1 2 3
    #   0 1 4 7 3
    #   1 2 5 8 4
    #   2 3 6 9 0
    

    【讨论】:

      猜你喜欢
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2018-01-23
      • 1970-01-01
      • 2012-06-13
      • 2020-05-14
      • 1970-01-01
      相关资源
      最近更新 更多