2015-08-26 4 views
14

Есть ли способ объединить три массива в R, чтобы первая строка первого массива сопровождалась первой строкой второго массива, а за ней следует третья строка третьего массива ? Так что, если я побежал следующий код:Объединение 3 массивов по номеру строки

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

Результат будет выглядеть следующим образом:

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

Я пытался расплавом, но я не могу заставить его работать.

ответ

18

Вы можете попробовать это:

> 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

Теперь это просто впечатляющее глубокое понимание «матрицы» – Vlo

+0

ничего себе, я бы никогда не догадался об этом. работая изнутри, я понимаю, как это работает, пока вы не достигнете самой внешней функции. Как вы узнали, что это будет? – user3390169

+0

Я не знаю, как я придумал это. Наверное, просто опыт и некоторая интуиция. – RHertel

0

Вид Hacky, но так как я напечатал его перед @RHertel опубликовал превосходное решение:

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" 

Это также «работает» (т. Е. Делает что-то разумное) для матриц с различным количеством строк.

Смежные вопросы