我有这个公式,它创建了251个元素的大型列表:
lapply(2:nrow(mat), function(y) cov(mat[1:y,]))
mat
有dim()
:
[1] 252 80
但我希望它从1开始,即1:nrow(mat)
,这样我得到的252个元素与nrow(mat)
相似。但是,将2:nrow(mat)
更改为1:nrow(mat)
会产生以下错误消息:
lapply(1:nrow(mat), function(y) cov(mat[1:y,]))
Error in cov(mat[1:y, ]) :
supply both 'x' and 'y' or a matrix-like 'x'
有没有人知道这个问题的解决办法?
答案 0 :(得分:2)
如果您尝试使用小矩阵,则可以更轻松地查看正在发生的事情:
mat=matrix(1:12, 3,4)
lapply(1:nrow(mat), function(y) cov(mat[1:y,]))
Error in cov(mat[1:y, ]) :
supply both 'x' and 'y' or a matrix-like 'x'
所以你得到cov
的{{1}}:
mat[1:1,]
突然不再是一个矩阵了!错误告诉你的是什么("提供......矩阵式' x'")。这是因为当您对单个行或列进行子集时,R会降低维度。使用> mat[1:1,]
[1] 1 4 7 10
调整此行为:
drop=FALSE
无论如何,列式协方差在这一点上都没有意义:
> mat[1:1,,drop=FALSE]
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
但它至少存在......