【问题标题】:Combining 3 arrays by row number按行号组合 3 个数组
【发布时间】:2015-08-27 02:58:32
【问题描述】:

有没有办法在 R 中组合三个数组,以便第一个数组的第一行之后是第二个数组的第一行,然后是第三个数组的第三行?所以,如果我运行以下代码:

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

我试过融化,但我无法让它工作。

【问题讨论】:

    标签: arrays r


    【解决方案1】:

    你可以试试这个:

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

    【讨论】:

    • 现在,这只是对matrix的一些令人印象深刻的深刻理解
    • 哇,我从来没想到过。从内到外,我理解它是如何工作的,直到你到达最外层的功能。你怎么知道它会那样做?
    • 我不知道我是怎么想到的。可能只是经验和一些直觉。
    【解决方案2】:

    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" 
    

    这对于具有不同行数的矩阵也“有效”(即,做一些明智的事情)。

    【讨论】:

      【解决方案3】:

      有点老套,但因为我在@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)
          ),
        ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 2014-06-19
        • 2016-08-30
        • 1970-01-01
        • 2019-06-24
        • 2013-08-28
        相关资源
        最近更新 更多