2015-08-26 4 views
14

C'è un modo per combinare tre array in R in modo che la prima riga del primo array sia seguita dalla prima riga del secondo array e che sia seguita dalla terza riga del terzo array ? Quindi, se ho eseguito il seguente codice:Combinazione di 3 array per numero di riga

> 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" 

Il risultato sarebbe simile a questa:

 [,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" 

ho cercato di fusione, ma non riesco a farlo funzionare.

risposta

18

Si potrebbe provare questo:

> 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

Ora, questa è solo una profonda comprensione di 'matrix' – Vlo

+0

wow, non l'avrei mai immaginato. lavorando da dentro, capisco come funziona fino ad arrivare alla funzione più esterna. Come sapevi che lo avrebbe fatto? – user3390169

+0

Non so come mi è venuto in mente. Probabilmente solo esperienza e intuizione. – RHertel

0

Tipo di hacky, ma da quando avevo digitato fuori prima @RHertel ha postato una soluzione superiore:

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" 

Anche questo "funziona" (ovvero, fa qualcosa di sensato) per matrici con diversi numeri di righe.

Problemi correlati