2012-01-19 13 views
1

できるだけ早く、行列の一部の行の最初の0を別のベクトルに格納された値に置き換えます。行列の行の最初のゼロ要素を置き換えます。

各行がいくつかのゼロを持つベクトルである数値行列があります。 私には2つのベクトルがあり、1つは行を含み、1つは置き換えられるもので、もう1つは新しい値:replace.in.these.rowsnew.valuesです。

matrix[replace.in.these.rows, corresponding.poz.of.the.1st.zero ] <- new.values 

を持つトリックはあります:また、私は今、私はインデックスベクトルの上にその反復する何かをしたいと思いますが、おそらくforループなしsapply

mat <- matrix(1,5,5) 
mat[c(1,8,10,14,16,22,14)] <- 0 
replace.in.these.rows <- c(1,2,3) 
new.values <- c(91,92,93) 

corresponding.poz.of.1st.zero <- sapply(replace.in.these.rows, 
             function(x) which(mat [x,] == 0)[1]) 

で最初のゼロのベクトルを生成することができます単純なベクトルよりも多くのインデックスを作成しますか?インデックスとしてリストや配列を(たとえば、列ごとに)使用することはできませんでした。

デフォルトでは、R個の行列は列ベクトルの集合です。転記された形式でデータを保存すると何かを得ることができますか?これは、行ではなく列で作業することを意味します。


コンテキスト

この行列ストアは、ネットワークのID-Sに連絡してください。これは、隣接行列n x nではなく、n x max.number .ofpartners(またはn * = 30)行列ではありません。

ネットワークでは、デフォルトでedgelistが使用されていますが、「Xからのすべてのリンク」をまとめて保存したかったのです。

私は

これは常にedgelist(複数回のシミュレーションでは、各ラウンド)から情報を抽出するよりも効率的であるかどうかわから仮定ではなく、私はまた、この直線的に成長しているマトリックス形式が保存するよりも高速であると仮定同一のフォーマットされたリスト内の同じ情報。

これらの文脈上の前提に関する一部のコメントも歓迎します。

+0

'行列[replace.in.these.rows + nrow(マトリックス)*(corresponding.poz.of.the.1st.zero-1)] < - new.values' – James

答えて

1

編集:のみ最初のゼロを置き換えることになっている場合、このアプローチは動作します:

first0s <-apply(mat[replace.in.these.rows, ] , 1, function(x) which(x==0)[1]) 
mat[cbind(replace.in.these.rows, first0s)] <- new.values 
> mat 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 91 1 1 0 1 
[2,] 1 1 1 1 92 
[3,] 1 93 1 1 1 
[4,] 1 1 0 1 1 
[5,] 1 0 1 1 1 

編集:私は目標は、選択した行のすべてのゼロを置き換えることだと思ったし、これはアプローチでしたが。完全にベクトル化手法:

idxs <- which(mat==0, arr.ind=TRUE) 
# This returns that rows and columns that identify the zero elements 
# idxs[,"row"] %in% replace.in.these.rows 
# [1] TRUE TRUE FALSE FALSE TRUE TRUE 
# That isolates the ones you want. 
# idxs[ idxs[,"row"] %in% replace.in.these.rows , ] 
# that shows what you will supply as the two column argument to "[" 
#  row col 
#[1,] 1 1 
#[2,] 3 2 
#[3,] 1 4 
#[4,] 2 5 
chosen.ones <- idxs[ idxs[,"row"] %in% replace.in.these.rows , ] 
mat[chosen.ones] <- new.values[chosen.ones[,"row"]] 
# Replace the zeros with the values chosen (and duplicated if necessary) by "row". 
mat 
#---------  
[,1] [,2] [,3] [,4] [,5] 
[1,] 91 1 1 91 1 
[2,] 1 1 1 1 92 
[3,] 1 93 1 1 1 
[4,] 1 1 0 1 1 
[5,] 1 0 1 1 1 
+0

素敵な答えと注釈は、ロジックをかなり簡単に従わせる。 +1 –

+0

...これは、各列の最初の値だけでなく、すべてのゼロ値を置き換えますか? – Tommy

+0

私はそれが要求されたものだと思った。異なるものが必要な場合は、簡単に修正することができます。多分私は編集を忘れましたか? –

関連する問題