【问题标题】:converting a matrix of lists to a regular matrix将列表矩阵转换为常规矩阵
【发布时间】:2010-12-03 15:58:12
【问题描述】:

取以下代码:

foo <- list()
foo[[1]] <- list(a=1, b=2)
foo[[2]] <- list(a=11, b=22)
foo[[3]] <- list(a=111, b=222)
result <- do.call(rbind, foo)
result[,'a']

在这种情况下,result[,'a'] 显示一个列表。有没有更优雅的方式让result 是一个“常规”向量矩阵?我想有手动的方法来解决这个问题,但我想知道我是否缺少一个明显的步骤。

【问题讨论】:

    标签: list r matrix


    【解决方案1】:

    列表上的do.call 非常优雅且快速。事实上 do.call(rbind, my.list) 曾经在我需要合并一个巨大的列表时节省了我的时间。这是迄今为止最快的解决方案。

    为了解决你的问题,可能是这样的:

    do.call(rbind, lapply(foo, unlist))
    
    
    > result.2 <- do.call(rbind, lapply(foo, unlist))
    > result.2
           a   b
    [1,]   1   2
    [2,]  11  22
    [3,] 111 222
    > result.2[, 'a']
    [1]   1  11 111
    > 
    

    【讨论】:

    • 我希望 do.call + rbind 很快。您是否尝试过将它与列表中的 10,000 个数据框一起使用?!
    • @hadley:我似乎记得在计算统计课上学到这是绑定列表的最快方法(在许多其他失败尝试之后)。也许我记错了。什么更快?
    • 如果您自己仔细编写,您可以管理大约 4 倍。 rbind.fill 在 plyr 的下一个版本中将包含我最近的最大努力。
    • 这是一个非常有趣的讨论;我发现了这个比较:biostat.wustl.edu/archives/html/s-news/2000-01/msg00169.html。我对 do.call 的信心已经破灭!谢谢哈德利。
    【解决方案2】:

    一种可能的解决方案如下(但我对替代方案感兴趣):

    new.result <- matrix(unlist(result), ncol=ncol(result), 
                  dimnames=list(NULL, colnames(result)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多