【问题标题】:sum a list of matrix, two constraints on NA对矩阵列表求和,对 NA 的两个约束
【发布时间】:2016-04-07 00:12:37
【问题描述】:

我有一个 矩阵 列表或类似矩阵的列表。每个矩阵包含许多 NA。 现在我想将所有矩阵添加到一个矩阵中。 (每个矩阵都有相同的维度和名称)

a   
           V1          V2          V3           
      [1,]  NA        4         21
      [2,]  NA        NA        4 

b   
           V1          V2          V3            
      [1,]  NA       NA           1
      [2,]  5        0           12

# mylist = list(a,b)

计算后,我想要一个类似的结果

        V1          V2          V3            
  [1,]   NA       4           22
  [2,]   5        0           16   

所以我有两个限制:

constraint 1: keep (NA+NA)=NA
constraint 2: keep (NA+1) = 1

我已尝试下页中的Reduceapply(simplify2array(.list), c(1,2), sum, na.rm=T) 函数,但我无法在计算中同时保留这两个约束。

Sum a list of matrices

就个人而言,使用上面的示例,我使用is.na 来识别每个矩阵中的所有NA,重叠每个元素的逻辑值 (a+b) ,表示如果对应的单元格都是 NA,则返回 length(mylist ),比如说2。然后用NA替换相应的celss

c = is.na(a)  return 

           V1          V2          V3           
      [1,] 1        0         0
      [2,] 1        1         0 

d = is.na(b)  return 

           V1          V2          V3            
      [1,]  1        1           0
      [2,]  0        0           0

identify.na = c + d return 
           V1          V2          V3            
      [1,]  2        1           0
      [2,]  1        1           0

result[identify.na==2] = NA

example 不是 R 中的确切代码,只是举例。 提前致谢。

【问题讨论】:

    标签: r list matrix na


    【解决方案1】:

    我们可以将cbind 向量转换为matrix ('m1'),得到'm1' 的rowSums 来创建'v2',以及逻辑矩阵来创建'v1'。将 'v1' 中为 0 的 'v2' 中的元素替换为 NA。

     m1 <- cbind(a, b)
     v1 <- rowSums(!is.na(m1))
     v2 <- rowSums(m1, na.rm=TRUE)
     v2[!v1] <- NA
     #[1] NA  1  5  0
    

    更新

    我们可以将矩阵放在listreplace中,NA元素为0,使用Reduce求和。我们用同样的方法得到逻辑矩阵(非 NA 元素)的总和,取反使 0 值变为 TRUE,1 为 FALSE,将 TRUE 替换为 NA (NA^..) 并与第一个输出相乘。

    l1 <- list(a1, b1)
    res <- Reduce(`+`, lapply(l1, function(x)
                          replace(x, is.na(x), 0)))
    res*NA^!Reduce(`+`, lapply(l1, function(x) !is.na(x)))
    #     [,1] [,2] [,3]
    #[1,]   NA    4   22
    #[2,]    5    0   16
    

    数据

     a <- c(NA, 1, 2, -1)
     b <- c(NA, NA, 3, 1)
     a1 <- matrix(c(NA, NA, 4, NA, 21, 4), ncol=3)
     b1 <- matrix(c(NA, 5, NA, 0, 1, 12), ncol=3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多