0

我有一个由 计算的主成分旋转向量的子列表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)并删除将被矢量化的索引(这里[[]])。我错过了什么?

4

1 回答 1

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).

于 2013-11-09T01:16:47.993 回答