【问题标题】:Convert list of vectors into matrix将向量列表转换为矩阵
【发布时间】:2014-03-09 06:52:28
【问题描述】:

我有一个矩阵:

b<-matrix(NA,ncol=100,nrow=10)

还有一个向量列表:

load("https://dl.dropboxusercontent.com/u/22681355/a.Rdata")

此列表包含 100 个向量。我想将列表中的每个向量分配给矩阵的一列。这可以吗?

【问题讨论】:

  • 您的数据不会为我加载。

标签: r matrix


【解决方案1】:

看看?do.call?cbind,例如:

## create an example list with 3 vectors
l <- list(c(1:3), c(4:6), c(7:9))

## columnwise binding of all vectors in the list `l`
do.call(cbind, l)

或者您可以使用简单的for 循环:

for (i in seq(along=l)) {
   n <- length(l[[i]])
   b[seq(n), i] <- l[[i]]
}

【讨论】:

  • 这似乎可行,但由于并非所有向量的长度都相同,我收到错误消息:警告消息:In (function (..., deparse.level = 1) : number of rows of结果不是向量长度的倍数(arg 1)
  • @user2733997:在这种情况下,您可以使用简单的for 循环。请查看我的编辑。
【解决方案2】:

类似这样的东西(不记得我从哪里得到的):

cbind.fill <- function(nm) {
    nm <- lapply(nm, as.matrix)
    n <- max(sapply(nm, nrow))
    do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n - nrow(x), ncol(x)))))
}

l <- list(c(1:3), c(4:8), c(7:9))
cbind.fill(l)

## > cbind.fill(l)
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## [4,]   NA    7   NA
## [5,]   NA    8   NA

【讨论】:

    【解决方案3】:

    一个技巧是首先“加长”向量,使它们的长度都相同(在您的情况下为 10)。在这里,我首先创建虚拟数据(只有 10 列,因此我可以轻松显示结果,但这扩展到您的 100 列情况):

    set.seed(1)
    lst <- replicate(10, sample(1:100, sample(5:10, 1)))   # 10 vectors, length 5-10
    

    现在加长,cbind

    lst <- lapply(lst, function(x) { length(x) <- 10; x }) # make all length 10
    do.call(cbind, lst)
    

    就是这样:

    #       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    #  [1,]   38   63  100   39   19   65   87   41    9    78
    #  [2,]   57    7   38   87   82   78   44   91   87    96
    #  [3,]   90   21   77   34   66   55   24   29   34    43
    #  [4,]   20   18   91   47   78   52    7   45   82    70
    #  [5,]   87   66   21   58   11   76   10   32   98    39
    #  [6,]   98   37   62   NA   69    3   31   62   32    31
    #  [7,]   NA   73   12   NA   39   45   49   25   45    72
    #  [8,]   NA   47   25   NA   NA   69   NA   97   83    NA
    #  [9,]   NA   NA   36   NA   NA   64   NA   NA   80    NA
    # [10,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
    

    【讨论】:

      【解决方案4】:

      如果你调用的位置大于向量的长度,你会在“额外位置”中得到NA。所以,一个简单的mapply 就可以了:

      set.seed(1)
      lst <- replicate(10, sample(1:100, sample(5:10, 1))) # Simulating data (Thanks @BrodieG!)
      
      mapply(function(x) x[1:10], lst) # You just need change tha maximium length
      

      【讨论】:

        【解决方案5】:
        matrix(unlist(list(c(1:3), c(4:6), c(7:9))), ncol = 3)
        

        【讨论】:

          猜你喜欢
          • 2015-01-30
          • 2018-03-01
          • 1970-01-01
          • 2018-07-17
          • 1970-01-01
          • 1970-01-01
          • 2017-06-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多