gpt4 book ai didi

r - 对矩阵列表求和,对 NA 的两个约束

转载 作者:行者123 更新时间:2023-12-04 11:00:46 25 4
gpt4 key购买 nike

我有一个矩阵列表或类似矩阵的列表。每个矩阵包含许多 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) ,意思是如果对应的cells都是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 中的确切代码,只是为了举例。提前致谢。

最佳答案

我们可以将向量cbind矩阵 ('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

更新

我们可以将矩阵放在列表中,替换,将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)

关于r - 对矩阵列表求和,对 NA 的两个约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com