假设X是D维数组。
我想用两个参数编写一个函数:
foo<-function(X,d){
....
}
其中foo必须在X的第d维上运行。 例如,提取第d维的元素 X.
如何做到这一点(我宁愿使用数组而不是列表)
答案 0 :(得分:1)
如果您的数组具有D维,则不能通过指定标量来引用单个维。相反,您需要提供尺寸矢量。例如,如果您的数组是:
set.seet(123)
X <- array(data=rnorm(12),dim=c(2,2,3))
然后,例如X[2]
将为您提供数组的单个元素。如果您尝试X[2,1]
,则会收到有关维度数不正确的错误。因此,获取整个维度的唯一选择是提供长度为D的向量,其中一个元素将为空,例如X[1,1,]
。这将为您提供数组的相应维度,在此特定示例中包含3个元素,该元素对应于定义。
当然,其他(指定的)尺寸可以在定义的边界内变化,例如X[1,2,]
。
答案 1 :(得分:0)
见?apply
,这是一个简单的例子:
x = array(c(1:8), dim = c(2,2,2))
#, , 1
#
# [,1] [,2]
#[1,] 1 3
#[2,] 2 4
#
#, , 2
#
# [,1] [,2]
#[1,] 5 7
#[2,] 6 8
apply(x, 3, sum)
#[1] 10 26
答案 2 :(得分:0)
以下是我最终解决问题的方法:目标是找到一种标准方法,用apply()
无缝替换lapply()
(因为后者很容易被并行化)。
这是一个简单的apply()
#data
n<-10
p<-5
k<-15
x<-array(rnorm(n*p*k),dim=c(n,p,k))
fx01<-function(ll,x,d0,dm,fun1){
dm[[d0]]<-ll
gotfun<-get(fun1)
gotfun(x[dm[[1]],dm[[2]],dm[[3]]])
}
#housekeeping:
d0<-3
lx<-length(dim(x))
dm<-vector("list",lx)
for(i in 1:lx) dm[[i]]<-1:dim(x)[i]
#the actual computations:
res<-lapply(1:dim(x)[d0],fx01,x=x,d0=d0,dm=dm,fun1="mean")
c(res,recursive=TRUE)
#compare with the real thing:
apply(x,d0,mean)