2016-10-06 13 views
2

マトリックス乗算のコンテキストで欠損値の伝播にいくつかの困難があります。 私の最初の行列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メートル以上では腐食されません(それはまったくです)。です。私は手動で各列をコーディングしないようにしたいと思います(ネットワークに何らかの変更があった場合、スクリプトはもう使えません)。 おかげで、

答えて

2

はい、私はこれは何が必要であると確信しています:

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があります。


フォローアップ

私は、データフレームに結果を変換しようとすると、エラーがスローされます。data.frame(X %*% ZZ)。どうしたらいいですか?

data.frame(as.matrix(X %*% ZZ))を使用してください。

+0

OK!それはトリック、あなたが私の一日を作ったおかげで!しかし、ちょうど1つの質問:元のコードでは、結果をdata.frameに変換しようとするとエラーが発生します。どうしたらいいですか? – agenis