R 求一个矩阵列表的和,两个约束在NA上
我有一个矩阵列表或类似矩阵的列表。每个矩阵包含许多NAs。 现在我想把所有的矩阵加在一个矩阵上。(每个矩阵具有相同的维度和DIMNAME) 经过计算,我想要一个这样的结果R 求一个矩阵列表的和,两个约束在NA上,r,list,matrix,na,R,List,Matrix,Na,我有一个矩阵列表或类似矩阵的列表。每个矩阵包含许多NAs。 现在我想把所有的矩阵加在一个矩阵上。(每个矩阵具有相同的维度和DIMNAME) 经过计算,我想要一个这样的结果 V1 V2 V3 [1,] NA 4 22 [2,] 5 0 16 所以我有两个限制: constraint 1: keep (NA+NA)=NA constra
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),意味着如果对应的单元格都是NAs,则返回长度(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
例如,example并不是R中的代码。
提前感谢。我们可以
cbind
到矩阵的向量('m1'),获取'm1'的行和
,创建'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
数据
a
m1 <- cbind(a, b)
v1 <- rowSums(!is.na(m1))
v2 <- rowSums(m1, na.rm=TRUE)
v2[!v1] <- NA
#[1] NA 1 5 0
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)