X が D 次元配列であるとします。
2 つの引数を持つ関数を書きたい:
foo<-function(X,d){
....
}
ここで、foo は X の d^ 次元で実行する必要があります。たとえば、X の d^ 次元の要素を抽出します。
これを行うにはどうすればよいですか (リストではなく配列を使用したい)
X が D 次元配列であるとします。
2 つの引数を持つ関数を書きたい:
foo<-function(X,d){
....
}
ここで、foo は X の d^ 次元で実行する必要があります。たとえば、X の d^ 次元の要素を抽出します。
これを行うにはどうすればよいですか (リストではなく配列を使用したい)
配列に D 次元がある場合、スカラーを指定して単一の次元を参照することはできません。代わりに、次元のベクトルを指定する必要があります。たとえば、配列が次の場合:
set.seet(123)
X <- array(data=rnorm(12),dim=c(2,2,3))
たとえばX[2]
、配列の単一の要素が得られます。しようX[2,1]
とすると、次元数が正しくないというエラーが表示されます。したがって、次元全体を取得する唯一のオプションは、長さ D のベクトルを提供することです。この場合、要素の 1 つが空になりますX[1,1,]
。これにより、定義に対応する 3 つの要素で構成されるこの特定の例では、配列のそれぞれの次元が得られます。
当然、他の (指定された) 寸法は、定義された境界内で変化する可能性がありますX[1,2,]
。
を参照してください?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
これが私が最終的に解決した方法です。目的は、をシームレスに置き換える標準的な方法を見つけることでし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)