总结一个矩阵列表,对NA

时间:2016-01-03 04:10:15

标签: r list matrix na

我有矩阵列表或矩阵列表。每个矩阵包含许多NA。 现在我想将所有矩阵添加到单个矩阵中。 (每个矩阵具有相同的维度和dimnames)

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,返回长度(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

示例不是R中的确切代码,仅作为示例。 提前谢谢。

1 个答案:

答案 0 :(得分:3)

我们可以cbind向量matrix('m1'),获取'{1}}'m1'来创建'v2',以及逻辑矩阵来创建'v1' ”。将'v2'中'0'中0的元素替换为NA。

rowSums

更新

我们可以将矩阵放在 m1 <- cbind(a, b) v1 <- rowSums(!is.na(m1)) v2 <- rowSums(m1, na.rm=TRUE) v2[!v1] <- NA #[1] NA 1 5 0 list,NA元素为0,使用replace得到总和。我们用相同的方法得到逻辑矩阵(非NA元素)的总和,否定它使0值变为TRUE,1变为FALSE,用NA(Reduce)替换TRUE并乘以第一个输出。

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