2017-11-18 7 views
-1

Ich muss einen neuen Vektor (in diesem Beispiel Zero-Vektor) in eine existierende Matrix einfügen. Das Problem ist, dass ich einen iterativen Prozess habe und die Positionen und die Anzahl der einzufügenden Vektoren ändern. Ich war nicht in der Lage, eine Funktion zu finden, die a) funktioniert und b) für große Datenmengen effizient genug ist.Spaltenvektor an bestimmter Position in Matrix dynamisch einfügen

Ein nicht-dynamischen Ansatz einfach cbind() ist

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 

Allerdings habe ich nicht an etwas denken konnte, die eingefügt werden mit beiden wechselnden Positionen und Anzahl von Vektoren arbeitet. Jede Hilfe wird sehr geschätzt, vielen Dank.

Antwort

2

cbind die Vektoren auf old und dann neu anordnen. Wenn wir wüssten, dass no bereits sortiert sind, können wir sort(no) durch no ersetzen.

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

Leider funktioniert dies nicht als Vec geht auf Position 5 und Vec2 geht auf Position 10. –

+0

Haben überarbeitet, um die Bedeutung in der Frage zu behalten. –

0

Erweiterung G. Grothendiecks Ansatz und die Lösung des Ordnungs Problem:

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

Edit: Sorry, nicht die Bearbeitung der Antwort sah oben :)

Verwandte Themen