将列表矩阵转换为常规矩阵

8

请看以下代码:

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 成为一个由向量组成的“常规”矩阵?我想可能有手动的方法可以解决这个问题,但我想知道是否有我忽略的明显步骤。
2个回答

9

在列表上使用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
> 

1
我希望do.call+rbind能够更快速。你是否曾经尝试过用它对一个拥有10,000个数据框的列表进行操作?! - hadley
@hadley:我好像在一门计算统计课上学到,这是绑定列表的最快方法(在许多失败的尝试之后)。也许我记错了。有什么更快的方法吗? - Vince
2
如果你仔细自己编写代码,你可以比使用其他方法快大约4倍。在接下来的 plyr 版本中,“rbind.fill” 将会包括我的最新努力。 - hadley
2
这是一个非常有趣的讨论;我发现了这个比较:http://www.biostat.wustl.edu/archives/html/s-news/2000-01/msg00169.html。我的do.call信仰已经破裂了!感谢Hadley。 - Vince

1
一个可能的解决方案如下(但我对其他方案也很感兴趣):
new.result <- matrix(unlist(result), ncol=ncol(result), 
              dimnames=list(NULL, colnames(result)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接