我有一个由prcomp
计算的主成分旋转向量的子列表,其中每个列表项是Nx2
数组(即两个列向量),用于每个类。
使用这些向量,我想将类似结构的一些数据投影到一个类列表中,每个类项包含维度为NxMxT
的数组,其中T
是试验次数。
我的问题是,我可以使用apply
及其变体编写简单的矢量化函数,但是我无法将其概括为将其应用于每个列表。
示例数据:
somedata <- list(array(rnorm(100),dim=c(5,4,5)),array(rnorm(100),dim=c(5,4,5)))
somevectors <- list(array(rnorm(10),dim=c(5,2)),array(rnorm(10),dim=c(5,2)))
以下是对每个列表元素的操作的简单示例:
o.proj.1 <- apply(somedata[[1]],3,function(x){
t(somevectors[[1]]) %*% x
}) # returns an array where each projected trial is a column
我尝试在调用lapply()
时调整此内容,但没有取得多大成功:
lapply(somedata, y = somevectors, function(x,y){
apply(x,3,function(z){
t(y) %*% z
})
})
Error in t(y) %*% z : requires numeric/complex matrix/vector arguments
基本上我的算法是将相应的apply
类型(此处为lapply
)放在更多本地函数周围,并删除将被矢量化的索引(此处为[[]]
)。我错过了什么?
答案 0 :(得分:2)
在*apply
函数族中,mapply
是您想要在两个或多个对象上同时循环时使用的函数。尝试:
o.proj <- mapply(function(x,y){
apply(x,3,function(z){
t(y) %*% z
})
}, somedata, somevectors, SIMPLIFY = FALSE)
我想您会希望使用SIMPLIFY = FALSE
来返回列表,否则mapply
会尝试将输出简化为数组,有点像sapply
。
另请注意,您可以使用Map
作为mapply(..., SIMPLIFY = FALSE)
的快捷方式。