Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么rbind和cbind与sapply产生相同的输出_R_Apply - Fatal编程技术网

为什么rbind和cbind与sapply产生相同的输出

为什么rbind和cbind与sapply产生相同的输出,r,apply,R,Apply,以下为列表列表: > 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(lll, rbind) [,1] [,2] [,3] [,4] [,5] [1,] 5 5 6 6 5 [2,] 3 3 2 1 2 [3,] 4 7

以下为列表列表:

> 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(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。调用
lappy

rbind

do.call(rbind, lapply(lll, rbind))
do.call(cbind, lapply(lll, cbind))
do.call(cbind, lll)
do.call(rbind, lll)
cbind

do.call(rbind, lapply(lll, rbind))
do.call(cbind, lapply(lll, cbind))
do.call(cbind, lll)
do.call(rbind, lll)
正如@zx8754所指出的,实际上可以跳过
apply
的用法,只需使用
do.call
即可完成(对于列表中的列表,我没有意识到这一点。谢谢!):

cbind
rbind

do.call(rbind, lapply(lll, rbind))
do.call(cbind, lapply(lll, cbind))
do.call(cbind, lll)
do.call(rbind, lll)

谢谢

通常,
cbind
rbind
适用于向量。例如,请参见以下内容:

v <- c(3,1,2)
cbind(v)
#     v
#[1,] 3
#[2,] 1
#[3,] 2

rbind(v)
#  [,1] [,2] [,3]
#v    3    1    2
为了让它发挥作用,我会这样做(尽管其他人已经建议):


x按照您编写它的方式,
rbind
分别应用于您的每个子列表,因此它实际上没有将它们与任何内容结合起来。在这种情况下,它真正做的就是将维度属性添加到子列表中,将其从
length=3
的列表更改为
dim=c(1,3)
的矩阵
cbind
除了得到
dim=c(3,1)
外,其他功能都是相同的。关键是,正如您编写的那样,
rbind
cbind
实际上都没有用于将子列表组合在一起。这一切都是由
sapply
完成的,
sapply
不关心它们作为矩阵的维度。它将它们视为向量,并将它们组合为列

考虑这个稍微简单的例子:

> sapply(list(list(1,2,3),list(4,5,6)),rbind)
     [,1] [,2]
[1,] 1    4   
[2,] 2    5   
[3,] 3    6   
这相当于:

> sapply(list(rbind(list(1,2,3)),rbind(list(4,5,6))),identity)
> sapply(list(matrix(list(1,2,3),c(1,3)),matrix(list(4,5,6),c(1,3))),identity)
这相当于:

> sapply(list(rbind(list(1,2,3)),rbind(list(4,5,6))),identity)
> sapply(list(matrix(list(1,2,3),c(1,3)),matrix(list(4,5,6),c(1,3))),identity)
这与此相当,因为
sapply
关心的是它们的长度,而不是它们的尺寸:

> sapply(list(c(1,2,3),c(4,5,6)),identity)
基本上就是这样(因为
sapply
将它们组合为列):

您真正想要的是调用
rbind
一次,将每个子列表作为参数,而不是在每个子列表上单独调用它。换句话说,您希望它能像这样工作:

> rbind(list(1,2,3),list(4,5,6))
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
但是,由于子列表已存储在单个列表中,因此可以通过使用
do.call
实现这一点,它允许您将
rbind
的所有参数作为单个
列表提供:

> list_of_lists <- list(list(1,2,3),list(4,5,6))
> do.call(rbind, list_of_lists)
     [,1] [,2] [,3]
[1,] 1    2    3   
[2,] 4    5    6   
>列表的列表do.call(rbind,列表的列表)
[,1] [,2] [,3]
[1,] 1    2    3   
[2,] 4    5    6   

do.call(rbind,lappy(lll,rbind))
do.call(cbind,lappy(lll,cbind))
。是的,这些都可以。你可能想把它作为一个答案,并做一些解释。@Abdou为什么是Lappy<代码>do.call(cbind,lll);do.call(rbind,lll)
?人们可能会被欺骗,认为
rbind
cbind
实际上组合了列表,但这只是因为
sapply
在这种情况下基本上做了
cbind
。本例中实际的
rbind
cbind
只是将子列表转换为矩阵,而
sapply
实际上并不关心它们是矩阵。将
rbind
替换为
identity
,您将在此处获得相同的输出。