代码之家  ›  专栏  ›  技术社区  ›  Christopher DuBois

如何从r中的向量列表中生成矩阵?

  •  94
  • Christopher DuBois  · 技术社区  · 15 年前

    目标:从等长的向量列表中,创建一个矩阵,其中每个向量成为一行。

    例子:

    > a <- list()
    > for (i in 1:10) a[[i]] <- c(i,1:5)
    > a
    [[1]]
    [1] 1 1 2 3 4 5
    
    [[2]]
    [1] 2 1 2 3 4 5
    
    [[3]]
    [1] 3 1 2 3 4 5
    
    [[4]]
    [1] 4 1 2 3 4 5
    
    [[5]]
    [1] 5 1 2 3 4 5
    
    [[6]]
    [1] 6 1 2 3 4 5
    
    [[7]]
    [1] 7 1 2 3 4 5
    
    [[8]]
    [1] 8 1 2 3 4 5
    
    [[9]]
    [1] 9 1 2 3 4 5
    
    [[10]]
    [1] 10  1  2  3  4  5
    

    我想要:

          [,1] [,2] [,3] [,4] [,5] [,6]
     [1,]    1    1    2    3    4    5
     [2,]    2    1    2    3    4    5
     [3,]    3    1    2    3    4    5
     [4,]    4    1    2    3    4    5
     [5,]    5    1    2    3    4    5
     [6,]    6    1    2    3    4    5
     [7,]    7    1    2    3    4    5
     [8,]    8    1    2    3    4    5
     [9,]    9    1    2    3    4    5
    [10,]   10    1    2    3    4    5 
    
    6 回复  |  直到 10 年前
        1
  •  115
  •   Christopher DuBois    15 年前

    一种选择是使用 do.call() :

     > do.call(rbind, a)
          [,1] [,2] [,3] [,4] [,5] [,6]
     [1,]    1    1    2    3    4    5
     [2,]    2    1    2    3    4    5
     [3,]    3    1    2    3    4    5
     [4,]    4    1    2    3    4    5
     [5,]    5    1    2    3    4    5
     [6,]    6    1    2    3    4    5
     [7,]    7    1    2    3    4    5
     [8,]    8    1    2    3    4    5
     [9,]    9    1    2    3    4    5
    [10,]   10    1    2    3    4    5
    
        2
  •  14
  •   Kalin Paul Lemmens    10 年前

    simplify2array 是一个相当直观的基本函数。但是,由于R的默认值是先按列填充数据,因此需要转换输出。( sapply 使用 简化2数组 ,如中所述 help(sapply) 。)

    > t(simplify2array(a))
          [,1] [,2] [,3] [,4] [,5] [,6]
     [1,]    1    1    2    3    4    5
     [2,]    2    1    2    3    4    5
     [3,]    3    1    2    3    4    5
     [4,]    4    1    2    3    4    5
     [5,]    5    1    2    3    4    5
     [6,]    6    1    2    3    4    5
     [7,]    7    1    2    3    4    5
     [8,]    8    1    2    3    4    5
     [9,]    9    1    2    3    4    5
    [10,]   10    1    2    3    4    5
    
        3
  •  11
  •   Paolo    15 年前

    不简单,但它可以工作:

    > t(sapply(a, unlist))
          [,1] [,2] [,3] [,4] [,5] [,6]
     [1,]    1    1    2    3    4    5
     [2,]    2    1    2    3    4    5
     [3,]    3    1    2    3    4    5
     [4,]    4    1    2    3    4    5
     [5,]    5    1    2    3    4    5
     [6,]    6    1    2    3    4    5
     [7,]    7    1    2    3    4    5
     [8,]    8    1    2    3    4    5
     [9,]    9    1    2    3    4    5
    [10,]   10    1    2    3    4    5
    
        4
  •  8
  •   Kalin Paul Lemmens    10 年前

    内置的 matrix 函数具有输入数据的良好选项 byrow . 把它和 unlist 在你的源列表上会给你一个矩阵。我们还需要指定行数,以便它可以分解未列出的数据。即:

    > matrix(unlist(a), byrow=TRUE, nrow=length(a) )
          [,1] [,2] [,3] [,4] [,5] [,6]
     [1,]    1    1    2    3    4    5
     [2,]    2    1    2    3    4    5
     [3,]    3    1    2    3    4    5
     [4,]    4    1    2    3    4    5
     [5,]    5    1    2    3    4    5
     [6,]    6    1    2    3    4    5
     [7,]    7    1    2    3    4    5
     [8,]    8    1    2    3    4    5
     [9,]    9    1    2    3    4    5
    [10,]   10    1    2    3    4    5
    
        5
  •  6
  •   Arihant    11 年前
    t(sapply(a, '[', 1:max(sapply(a, length))))
    

    其中“a”是一个列表。 适用于不相等的行大小

        6
  •  3
  •   learnr    15 年前
    > library(plyr)
    > as.matrix(ldply(a))
          V1 V2 V3 V4 V5 V6
     [1,]  1  1  2  3  4  5
     [2,]  2  1  2  3  4  5
     [3,]  3  1  2  3  4  5
     [4,]  4  1  2  3  4  5
     [5,]  5  1  2  3  4  5
     [6,]  6  1  2  3  4  5
     [7,]  7  1  2  3  4  5
     [8,]  8  1  2  3  4  5
     [9,]  9  1  2  3  4  5
    [10,] 10  1  2  3  4  5