r - 避免矩阵乘法中 NA 的传播

标签 r matrix matrix-multiplication missing-data

我在矩阵乘法的上下文中传播缺失值时遇到一些困难。 我的第一个矩阵 X 是 5 个流量计每小时的气体流量测量值:

X=structure(c(16, 19, 28, 32, 30, 22, 16, 13, 8, 6, 5, 3, 5, 5, 6, 13, 7, 10, 4, 2, 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, -16, -17, -20, -31, -25, -25, -16, -12, -13, -15, -9, -7), .Dim = c(12L, 5L), .Dimnames = list(NULL, c("meter1", "meter2", "meter3", "meter4", "meter5")))
####      meter1 meter2 meter3 meter4 meter5
#### [1,]     16      5      0      7    -16
#### [2,]     19      5      0      8    -17
#### ...

我的第二个矩阵 Z 表示这些气体流量如何分配以供给 4 个城市:例如(Z 的第一列),对于 city1,定义了总净流量作为(1)*Meter1 + (-1)*Meter2 + (1)*Meter5之和。

Z=structure(c(1, -1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0), .Dim = c(5L, 4L), .Dimnames = list(NULL, c("city1", "city2", "city3", "city4")))
####      city1 city2 city3 city4
#### [1,]     1     0     0     0
#### [2,]    -1     1     0     0
#### [3,]     0     1     0     0
#### [4,]     0     0     1     0
#### [5,]     1     0     0     0

因此,要计算每个城市的净流量,我只需进行矩阵乘法:

X %*% Z
####      city1 city2 city3 city4
#### [1,]    -5     5     7     0
#### [2,]    -3     5     8     0
#### ...

我的问题是我的X矩阵中有很多缺失值x(这里是9NA):

set.seed(3); for (i in 1:10) X[sample.int(nrow(X), 1), sample.int(ncol(X), 1)] <- NA

当我进行矩阵乘法时,NA 会传播到整行,即使它位于零值列上(这不会影响总和)。所以乘法后我得到 24 NA 。但是,如果我仅使用非空的仪表进行逐个城市的计算,我只会得到 11 NA:

sum(is.na(cbind(X[, 1] - X[, 2] + X[, 5], X[, 2] + X[, 3], X[, 4], 0)))
#### [1] 11

我想知道是否有一种方法可以计算每个城市的流量,而不会过多地传播我的NA。实际上,我的矩阵要大得多,但城市的高度永远不会超过 4 米(这是相当稀疏)。我想避免手动编码每一列(因为如果网络发生任何变化,脚本将不再工作)。 谢谢,

最佳答案

是的,我确信这就是您所需要的:

library(Matrix)
ZZ <- Matrix(Z, sparse = TRUE)
X %*% ZZ

#12 x 4 Matrix of class "dgeMatrix"
#      city1 city2 city3 city4
# [1,]    -5     5     7     0
# [2,]    NA    NA    NA     0
# [3,]    NA     6     8     0
# [4,]   -12    13     7     0
# [5,]    NA    NA     7     0
# [6,]   -13    10     6     0
# [7,]    -4    NA    NA     0
# [8,]    -1     2    NA     0
# [9,]    -6     1     5     0
#[10,]   -11     2     4     0
#[11,]    NA    NA     4     0
#[12,]    -5     1     4     0

如您所料,只有 11 个 NA


后续

It throws an error when I try to convert the result to a data frame: data.frame(X %*% ZZ). How can I do it?

使用data.frame(as.matrix(X %*% ZZ))

关于r - 避免矩阵乘法中 NA 的传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39898135/

相关文章:

matlab - 如何使用Matlab的bsxfun求解累加和

R:矢量化循环以创建成对矩阵

c - 使用连续的内存分配,乘以大矩阵要慢得多

r - ggplot 的时间轴

r - 如何在knitr R代码块中间插入markdown?

通过索引值将数据框中的值替换为另一个数据框中的值

javascript - 物体中的负数/正数自身反转?

javascript - 4x4 矩阵乘法顺序

c++ - 如何使用 SSE 更有效地乘以 A*B^T 或 A^T*B^T(T 表示转置)矩阵?

r - 你如何在 R 中打开连字符和逗号分隔的数字范围?例如 1,3,5-7 -> 1,3,5,6,7 在不同的行