2017-11-29 33 views
1

ベクトル形式の約4000個の行列を含むデータセットを作成しました。それぞれのデータセットには作成日の名前を付ける必要があります。forループ中に変数を代入して使用するR

今私は、次のしている:

dates <- unique(rcov_matrix$dateid) 

for(k in dates){ 
    k <- matrix(0, 30, 30) 
    for(i in 1:30){ 
    for (j in 1:i){ 
     number <- number + 1 
     value <- rcov_matrix[1, number] 
     k[i,j] <- value 
     k[j,i] <- value 
    } 
    } 
} 

をコードが正しく行列にベクトルのエントリを割り当てますが、私は唯一の最後にKという名前の1つの行列で終わります。 これは、変数名がRで割り当てられる方法が原因であることを理解していますが、同様の投稿の問題に対して実行可能な解決策が見つかりませんでした。

assign(k, matrix(0, 30, 30)) 

私は次のforループで後で変数名を再使用する必要があるため、機能しません。

どうすればこの問題を解決できますか?または、私の値を行列に割り当てるより効果的な方法がありますか?

ありがとうございます。

答えて

0

おそらく最も簡単なのは、開始よりもループの最後にassignを使用することです。

また
for (k in dates){ 
    This_k <- matrix(0, 30, 30) 
    for(i in 1:30){ 
    for (j in 1:i){ 
     value <- rnorm(1) # I use rnorm here to make the example reproducible 
     This_k[i,j] <- value 
     This_k[j,i] <- value 
    } 
    } 
    assign(k, This_k) 
} 

(そしておそらくもう少し効率的)、リストにあなたの行列を入れて、リストのインデックスを使用することができます。

klist = lapply(rep(0, length(dates)), matrix, 30, 30) 
names(klist) = dates 

for (k in dates){ 
    for(i in 1:30){ 
    for (j in 1:i){ 
     value <- rnorm(1) 
     klist[[k]][i,j] <- value 
     klist[[k]][j,i] <- value 
    } 
    } 
} 
+0

時々最も簡単な解決策は最高です!ありがとうございました。 – myname

+0

はい、単純なバージョンが最適です。しかし、この場合、効率を上げるために(特に行列が大きい場合は特に行列のコピーが少ない)、また後でスクリプトのインデックス作成が容易になるように、2番目のリストのバージョンを優先します。基本的に、シーケンシャルな名前を持つ同様のオブジェクトの "リスト"がある場合、使用する自然なデータ構造は実際の 'list'です – dww

関連する問題