【问题标题】:Average Matrices with missing data using R使用r缺少数据的平均矩阵
【发布时间】:2021-06-10 13:04:53
【问题描述】:

我有三个 108x108 矩阵,我想从中计算它们的平均矩阵。矩阵中缺少数据,我希望将其从单元格平均值的计算中排除。如果三个矩阵中只有两个日期条目,则应为该单元格计算两个现有条目的平均值。下面是一个插图。必须有一个命令来轻松平均具有 NA 的矩阵?

Matrix 1: 

3  3  3

NA 3  3

Matrix 2: 

3  3  3

3  3  3

Matrix 3: 

3  3  3

3  3  3

Average Matrix:

3  3  3

3  3  3

"Average

希望有人能指导一下!提前谢谢你。

【问题讨论】:

    标签: r matrix command average na


    【解决方案1】:
    # create sample data reproducibly
    m1 = m2 = m3 = matrix(3, 2, 3)
    m1[2, 1] = NA
    
    # put your matrices in an array
    a = array(c(m1, m2, m3), dim = c(dim(m1), 3))
    
    # apply the `mean` function with `na.rm = TRUE`
    apply(a, 1:2, mean, na.rm = TRUE)
    #      [,1] [,2] [,3]
    # [1,]    3    3    3
    # [2,]    3    3    3
    

    【讨论】:

      【解决方案2】:

      以下是三个基本解决方案:

      1) 使用注释中可重现的输入,最后使用mapply,然后将结果重新整形为矩阵。

      Mean <- function(...) mean(c(...), na.rm = TRUE)
      replace(m1, TRUE, mapply(Mean, m1, m2, m3))
      ##      [,1] [,2] [,3]
      ## [1,]    3    3    3
      ## [2,]    3    3    3
      

      2) 使用 sapply 创建一个矩阵,每个输入矩阵有一列,然后对给出向量的行进行平均。将其重新整形为矩阵。

      L <- list(m1, m2, m3)
      replace(L[[1]], TRUE, rowMeans(sapply(L, c), na.rm = TRUE))
      ##      [,1] [,2] [,3]
      ## [1,]    3    3    3
      ## [2,]    3    3    3
      

      3) 将 NA 替换为 0 并求和,然后除以非 NA 的数量。我们可以交替使用 zoo 的 na.fill(x, 0) 将 x 中的 NA 替换为 0 代替 na2zero。

      na2zero <- function(x) ifelse(is.na(x), 0, x)
      Sum <- function(L, f) Reduce("+", lapply(L, f))
      Sum(L, na2zero) / Sum(L, Negate(is.na))
      ##      [,1] [,2] [,3]
      ## [1,]    3    3    3
      ## [2,]    3    3    3
      

      3a) 或者写出来而不是使用 Reduce:

      (na2zero(m1) + na2zero(m2) + na2zero(m3)) /
         ((!is.na(m1)) + (!is.na(m2)) + (!is.na(m3)))
      ##      [,1] [,2] [,3]
      ## [1,]    3    3    3
      ## [2,]    3    3    3
      

      注意

      m1 <- m2 <- m3 <- matrix(3, 2, 3)
      m1[2, 1] <- NA
      

      【讨论】:

        【解决方案3】:

        BaseR

        matrix(rowMeans(matrix(rbind(m,k,l),ncol=3),na.rm=T),2)
        

        给予,

             [,1] [,2] [,3]
        [1,]    3    3    3
        [2,]    3    3    3
        

        数据:

        m <- matrix(3,2,3)
        k <-  matrix(3,2,3)
        l <-  matrix(3,2,3)
        m[2,1] <- NA
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-23
          • 2016-11-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多