对矩阵列表求和,对 NA 的两个约束
sum a list of matrix, two constraints on NA
我有一个 矩阵 或类似矩阵的列表。每个矩阵包含许多 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
我尝试了下一页中的 Reduce
和 apply(simplify2array(.list), c(1,2), sum, na.rm=T)
函数,但我无法在计算中保留这两个约束。
Sum a list of matrices
个人使用上面的例子,我用is.na
来标识每个矩阵中的所有NA
,重叠每个元素的逻辑值 (a+b) ,意味着如果对应的单元格都是NAs, return length(mylist), say 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 中的确切代码,只是为了举例。
提前致谢。
我们可以 cbind
向量到 matrix
('m1'),得到 'm1' 的 rowSums
来创建 'v2',和创建 'v1' 的逻辑矩阵。将 'v2' 中 'v1' 中为 0 的元素替换为 NA.
m1 <- cbind(a, b)
v1 <- rowSums(!is.na(m1))
v2 <- rowSums(m1, na.rm=TRUE)
v2[!v1] <- NA
#[1] NA 1 5 0
更新
我们可以把矩阵放在list
,replace
,NA元素为0,求和用Reduce
。我们用同样的方法得到逻辑矩阵(non-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)
我有一个 矩阵 或类似矩阵的列表。每个矩阵包含许多 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
我尝试了下一页中的 Reduce
和 apply(simplify2array(.list), c(1,2), sum, na.rm=T)
函数,但我无法在计算中保留这两个约束。
Sum a list of matrices
个人使用上面的例子,我用is.na
来标识每个矩阵中的所有NA
,重叠每个元素的逻辑值 (a+b) ,意味着如果对应的单元格都是NAs, return length(mylist), say 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
example 不是 R 中的确切代码,只是为了举例。 提前致谢。
我们可以 cbind
向量到 matrix
('m1'),得到 'm1' 的 rowSums
来创建 'v2',和创建 'v1' 的逻辑矩阵。将 'v2' 中 'v1' 中为 0 的元素替换为 NA.
m1 <- cbind(a, b)
v1 <- rowSums(!is.na(m1))
v2 <- rowSums(m1, na.rm=TRUE)
v2[!v1] <- NA
#[1] NA 1 5 0
更新
我们可以把矩阵放在list
,replace
,NA元素为0,求和用Reduce
。我们用同样的方法得到逻辑矩阵(non-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)