【发布时间】:2016-09-30 14:53:38
【问题描述】:
包含以下列表:
> lll = list(list(5,3,4), list(5,3,7), list(6,2,1), list(6,1,3), list(5,2,1))
我希望输出用 rbind 和 cbind 用 sapply 转置,但它们是相同的:
> sapply(lll, rbind)
[,1] [,2] [,3] [,4] [,5]
[1,] 5 5 6 6 5
[2,] 3 3 2 1 2
[3,] 4 7 1 3 1
> sapply(lll, cbind)
[,1] [,2] [,3] [,4] [,5]
[1,] 5 5 6 6 5
[2,] 3 3 2 1 2
[3,] 4 7 1 3 1
>
> identical(sapply(lll, cbind), sapply(lll, rbind))
[1] TRUE
为什么会这样?什么代码会产生 cbind 与 rbind 的转置输出?
【问题讨论】:
-
do.call(rbind, lapply(lll, rbind))? -
和
do.call(cbind, lapply(lll, cbind))。 -
是的,这些工作。您可能想将其作为答案并进行一些解释。
-
@Abdou 为什么选择 lapply?
do.call(cbind, lll); do.call(rbind, lll)? -
人们可能会被欺骗认为
rbind或cbind实际上组合了列表,但这只是因为sapply在这种情况下基本上是cbind。这个例子中实际的rbind或cbind只是将子列表转换为矩阵,sapply实际上并不关心它们是矩阵。将rbind替换为identity,您将在此处获得相同的输出。