マトリックス乗算のコンテキストで欠損値の伝播にいくつかの困難があります。 私の最初の行列X
5つの流量計のための時間ごとのガス流量測定である:行列乗算におけるNAの伝播を避ける
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
#### ...
マイ第2のマトリックス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
matriで欠損値がたくさんあるということです X(ここでは9 NA
は):私は行列の乗算を行うと
set.seed(3); for (i in 1:10) X[sample.int(nrow(X), 1), sample.int(ncol(X), 1)] <- NA
NA
はに伝播しますゼロ値の列に配置されていても行全体(これは合計に影響しません)。だから私は24 NA
の乗算の後になる。私は唯一の非nullであるメートルで、市内で計算街を行う場合は、私は11 NA
を得る:
sum(is.na(cbind(X[, 1] - X[, 2] + X[, 5], X[, 2] + X[, 3], X[, 4], 0)))
#### [1] 11
のこの計算を行う方法がある場合、私は知りたいのですが私のNA
をあまり伝播しない都市ごとに流れます。現実には私の行列ははるかに大きいですが、都市は決して4メートル以上では腐食されません(それはまったくです)。です。私は手動で各列をコーディングしないようにしたいと思います(ネットワークに何らかの変更があった場合、スクリプトはもう使えません)。 おかげで、
OK!それはトリック、あなたが私の一日を作ったおかげで!しかし、ちょうど1つの質問:元のコードでは、結果をdata.frameに変換しようとするとエラーが発生します。どうしたらいいですか? – agenis