2015-08-26 12 views
14

Gibt es eine Möglichkeit, drei Arrays in R zu kombinieren, sodass auf die erste Zeile des ersten Arrays die erste Zeile des zweiten Arrays gefolgt von der dritten Zeile des dritten Arrays folgt ? So lief, wenn ich den folgenden Code:Kombinieren von 3 Arrays nach Zeilennummer

> number1<-rbind(rep("A",3), rep("B",3), rep("C",3)) 
> number1 
    [,1] [,2] [,3] 
[1,] "A" "A" "A" 
[2,] "B" "B" "B" 
[3,] "C" "C" "C" 
> number2<-rbind(rep(1,3), rep(2,3), rep(3,3)) 
> number2 
    [,1] [,2] [,3] 
[1,] 1 1 1 
[2,] 2 2 2 
[3,] 3 3 3 
> number3<-rbind(rep("X",3), rep("Y",3), rep("Z",3)) 
> number3 
    [,1] [,2] [,3] 
[1,] "X" "X" "X" 
[2,] "Y" "Y" "Y" 
[3,] "Z" "Z" "Z" 

Das Ergebnis sieht wie folgt aus:

 [,1] [,2] [,3] 
[1,] "A" "A" "A" 
[2,] "1" "1" "1" 
[3,] "X" "X" "X" 
[4,] "B" "B" "B" 
[5,] "2" "2" "2" 
[6,] "Y" "Y" "Y" 
[7,] "C" "C" "C" 
[8,] "3" "3" "3" 
[9,] "Z" "Z" "Z" 

ich Schmelze versucht, aber ich kann es nicht zu arbeiten.

Antwort

18

Sie konnten dieses versuchen:

> matrix(t(cbind(number1,number2,number3)),ncol=3, byrow=T) 
#  [,1] [,2] [,3] 
# [1,] "A" "A" "A" 
# [2,] "1" "1" "1" 
# [3,] "X" "X" "X" 
# [4,] "B" "B" "B" 
# [5,] "2" "2" "2" 
# [6,] "Y" "Y" "Y" 
# [7,] "C" "C" "C" 
# [8,] "3" "3" "3" 
# [9,] "Z" "Z" "Z" 
+2

Nun, das ist nur ein paar beeindruckende tiefes Verständnis von "Matrix" – Vlo

+0

wow, hätte ich nie gedacht, dass. von innen nach außen arbeitend, verstehe ich, wie es funktioniert, bis man zur äußersten Funktion gelangt. Woher weißt du, dass es das tun würde? – user3390169

+0

Ich weiß nicht, wie ich darauf gekommen bin. Wahrscheinlich nur Erfahrung und Intuition. – RHertel

0

Art hacky, aber da ich es getippt hatte, bevor @RHertel eine überlegene Lösung gepostet:

wrong_order <- rbind (number1, number2, number3) 
row_n <- nrow (wrong_order) 

right_order <- wrong_order[ 
    c(seq (1, row_n, by=3), 
    seq (2, row_n, by=3), 
    seq (3, row_n, by=3) 
    ), 
    ] 
4

Copying Arun's approach to interleaving two lists ...

intermat <- function(...) 
    do.call(rbind,list(...))[ 
    order(sapply(list(...),function(x) 1:nrow(x))), ] 

intermat(number1,number2,number3) 

     [,1] [,2] [,3] 
[1,] "A" "A" "A" 
[2,] "1" "1" "1" 
[3,] "X" "X" "X" 
[4,] "B" "B" "B" 
[5,] "2" "2" "2" 
[6,] "Y" "Y" "Y" 
[7,] "C" "C" "C" 
[8,] "3" "3" "3" 
[9,] "Z" "Z" "Z" 

Dies funktioniert auch "funktioniert" (dh tut etwas Sinnvolles) für Matrizen mit unterschiedlicher Anzahl von Zeilen.