2016-03-21 14 views
3

3×3の行列mに1つ以上のゼロがあり、各ゼロを所定の数で置き換えたいとします。列iにある行列/データフレームの値をベクトルのi番目の要素に置き換えます。

交換は、この規則に従わなければならない:ゼロmの最初の列に見つかった場合

をゼロmの2列目に発見された場合、それは、ベクターvの最初の要素と置き換えなければなりませんそれはベクトルvの第2の要素と置き換えられ、第3の列/ベクトル要素についても同じでなければなりません。

行列及びベクトルである。もちろん

m <- matrix(c(0,2,3,4,0,6,0,8,0), 3, 3, byrow = TRUE) 
v <- c(1,5,9) 

vlengthmの列の数と一致しなければなりません。だから、マトリックスは、このようなものです:最終的な結果はなるよう

0 2 3 
4 0 6 
0 8 0 

私は、そうでRはmの最初の列にゼロを見つけた時はいつでも、それはベクトルvの最初の要素でそれを置き換えることをしたい、と:

1 2 3 
4 5 6 
1 8 9 

私は多くの研究を行い、この問題の解決策は見つかりませんでした。誰かが助けてくれますか?

+0

'mの[メートル== 0] < - V [1]'あなたの問題の説明に反し、ご希望の結果では、望ましい結果 – Jaap

+1

を与え、あなたは常に 'Vとゼロを置き換える[1]'。 – Julius

+1

あなたの説明は、結果が 'matrix(c(1,4,1,2,5,8,3,6,9)、3)' –

答えて

2

私はあなたの提案されたソリューションが間違っていると、ここで、あなたのテキストで説明クルンテープ問題を解決すると思いました。 which.arr.ind=TRUEで呼び出されると、2つの列行列が返されます。これは、i、iの参照として、行列またはデータフレームの索引付けに使用できます。この場合、2番目の列をvオブジェクトのインデックスとして使用することもできます。

> m[ which(m==0, arr.ind=TRUE) ] <- v[ which(m==0, arr.ind=TRUE)[,2] ] 
> m 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 4 5 6 
[3,] 1 8 9 
+0

ありがとうございました。あなたの答えは、 'which'コマンドと' arr.ind'パラメータについてもっと知るべきだと私に伝えます。ありがとうございました – Eduardo

+1

または 'm [m == 0] < - v [col(m)[m == 0]]をバリエーション – thelatemail

+0

かなり滑らかに見えます。他にどのような可能性があるかを知る必要があります。代替回答を投稿してください。私は確かにそれをupvoteしたいと思います。 –

4
m + t((t(m) == 0) * v) 
#  [,1] [,2] [,3] 
# [1,] 1 2 3 
# [2,] 4 5 6 
# [3,] 1 8 9 

または

m + sweep(m == 0, 2, v, `*`) 
#  [,1] [,2] [,3] 
# [1,] 1 2 3 
# [2,] 4 5 6 
# [3,] 1 8 9 
+0

OPはそれが列方向であることを望んでいますので、それは次のようになります: 'm + t((t(m)== 0)* v)' – Jaap

+0

、 ProcrastinatusMaximus。 – Julius

+0

ありがとうJulius。あなたの答えは行列の乗算を使用しているので、問題を解決するこの方法が非常に好きです。 – Eduardo

関連する問題