在 R 中使用 lapply 创建(协方差)矩阵列表时出错
Errors in creating a list of (covariance) matrices using lapply in R
我有这个公式,它创建了一个包含 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'
有人知道这个问题的解决方法吗?
如果你用一个小矩阵进行试验,你可以更容易地看到发生了什么:
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'
所以你得到 mat[1:1,]
的 cov
:
> mat[1:1,]
[1] 1 4 7 10
这突然不再是矩阵了!这就是错误告诉您的内容 ("supply ... matrix-like 'x'")。这是因为当您对单个行或列进行子集化时,R 会删除维度。使用 drop=FALSE
:
调整此行为
> mat[1:1,,drop=FALSE]
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
列协方差无论如何在这一点上都不是很有意义:
> cov(mat[1:1,, drop=FALSE])
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] NA NA NA NA
[3,] NA NA NA NA
[4,] NA NA NA NA
但它至少存在...
我有这个公式,它创建了一个包含 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'
有人知道这个问题的解决方法吗?
如果你用一个小矩阵进行试验,你可以更容易地看到发生了什么:
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'
所以你得到 mat[1:1,]
的 cov
:
> mat[1:1,]
[1] 1 4 7 10
这突然不再是矩阵了!这就是错误告诉您的内容 ("supply ... matrix-like 'x'")。这是因为当您对单个行或列进行子集化时,R 会删除维度。使用 drop=FALSE
:
> mat[1:1,,drop=FALSE]
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
列协方差无论如何在这一点上都不是很有意义:
> cov(mat[1:1,, drop=FALSE])
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] NA NA NA NA
[3,] NA NA NA NA
[4,] NA NA NA NA
但它至少存在...