我有矩阵列表或矩阵列表。每个矩阵包含许多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
我已尝试Reduce
和apply(simplify2array(.list), c(1,2), sum, na.rm=T)
函数,如下页所示,但我无法在计算中保留这两个约束。
就个人而言,使用上面的例子,我使用is.na
来识别每个矩阵中的所有NA
,重叠每个元素的逻辑值(a + b),意味着相应的单元格是否都是NA,返回长度(mylist),比如2.然后用NA
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中的确切代码,仅作为示例。 提前谢谢。
答案 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