访问数组的给定维度

时间:2013-04-24 18:49:34

标签: r

假设X是D维数组。

我想用两个参数编写一个函数:

foo<-function(X,d){
   ....
}

其中foo必须在X的第d维上运行。 例如,提取第d维的元素 X.

如何做到这一点(我宁愿使用数组而不是列表)

3 个答案:

答案 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)