2017-11-18 18 views
-1

新しいベクトル(この例ではゼロベクトル)を既存の行列に配置する必要があります。問題は、反復プロセスと、挿入するベクトルの位置と数が変化していることです。私は、a)働き、b)膨大な量のデータに対して十分に効率的であるという機能を思い付くことができませんでした。単にcbind()を使用してマトリックス内の特定の位置に列ベクトルを動的に挿入します。

非動的なアプローチは

old <- matrix(1,10,10) #original matrix 
vec <- matrix(5,10,1) #vector 1 to insert 
vec2 <- matrix(8,10,1) #vector 2 to insert 
old 

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 1 1 1 1 1 1 1 1 1  1 
[2,] 1 1 1 1 1 1 1 1 1  1 
[3,] 1 1 1 1 1 1 1 1 1  1 
[4,] 1 1 1 1 1 1 1 1 1  1 
[5,] 1 1 1 1 1 1 1 1 1  1 
[6,] 1 1 1 1 1 1 1 1 1  1 
[7,] 1 1 1 1 1 1 1 1 1  1 
[8,] 1 1 1 1 1 1 1 1 1  1 
[9,] 1 1 1 1 1 1 1 1 1  1 
[10,] 1 1 1 1 1 1 1 1 1  1 

#assume that the positions to insert are 4 and 8 

goal <- cbind(old[,c(1:3)], 
       vec, 
       old[,4:6], #attention, now old column 6 is new column 7 
       vec2, 
       old[,7:ncol(old)]) 

goal 

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] 
[1,] 1 1 1 5 1 1 1 8 1  1  1  1 
[2,] 1 1 1 5 1 1 1 8 1  1  1  1 
[3,] 1 1 1 5 1 1 1 8 1  1  1  1 
[4,] 1 1 1 5 1 1 1 8 1  1  1  1 
[5,] 1 1 1 5 1 1 1 8 1  1  1  1 
[6,] 1 1 1 5 1 1 1 8 1  1  1  1 
[7,] 1 1 1 5 1 1 1 8 1  1  1  1 
[8,] 1 1 1 5 1 1 1 8 1  1  1  1 
[9,] 1 1 1 5 1 1 1 8 1  1  1  1 
[10,] 1 1 1 5 1 1 1 8 1  1  1  1 

あるしかし、私は挿入するように変化する位置とベクトルの数の両方で動作する何かを考えることができませんでした。 ご協力いただきありがとうございます。ありがとうございます。

答えて

2

ベクターをベクターに結合してoldに連結してから並べ替えます。 noがすでにソートされていることが分かっていれば、sort(no)noに置き換えることができました。

no <- c(4, 8) 
vecs <- cbind(vec, vec2) 
cbind(old, vecs)[, order(c(1:ncol(old), sort(no) - seq_along(no))) ] 
+0

上の回答の編集を見ていないがvecは5位に、vec2は10位に移動します。 –

+0

質問に意味を残すように改訂しました。 –

0

G. Grothendiecksアプローチを拡張し、発注の問題解決:

pos<-c(4,8) 
pos<-pos-c(1:length(pos)) 
cbind(old, vec, vec2)[, order(c(1:ncol(old), c(pos)))] 

編集:申し訳ありませんが、残念ながらこれはとしては動作しません:)

関連する問題