我基本上是尝试一次指定一个n维数组的一个索引(或两个)(将所有其他索引留空),其中指定索引的位置和数组的维数都是我的代码中的参数(即,我需要使用它来处理n> 1的任何n维数组)。
我有一个维度为2x2x ... x2的数组(H)(n个维度,每个索引范围为1到2)。 n未指定,仅限于n> 1。
我有另一个维度为nx2x2x ... x2的数组(J)(总共n + 1个维度,其中第一个维度的索引范围是1到n,其他维度的索引范围是1到2)。
我正在尝试使用一个for循环来定义数组的以下子集(假设n = 4):
J[1,1,,,]<-H[1,,,]
J[1,2,,,]<-H[1,,,]
J[2,,1,,]<-H[,1,,]
J[2,,2,,]<-H[,1,,]
J[3,,,1,]<-H[,,1,]
J[3,,,2,]<-H[,,1,]
J[4,,,,1]<-H[,,,1]
J[4,,,,2]<-H[,,,1]
我一直在通过遍历i = 1到i = n并尝试为i的每个值定义J的相关子集来做到这一点。但是,为此,我需要一种方法来指示任意数量的“空白”索引。 对于固定的n和固定的i,这很简单-您可以将索引保留为空白,如上所示,或替换为TRUE:
J[1,1,TRUE,TRUE,TRUE]
#is equivalent to
J[1,1,,,]
为了使它适用于维度数组n,我最初尝试创建一个由数字和'TRUE'值组成的单行索引矩阵,但是当然R会将所有值强制转换为数字。列表或单行数据框允许数字和逻辑条目,但不能用于索引数组。这是我在下面包含的示例代码中遇到的问题。
J<-array(NA,dim=c(n,rep(2,n)))
for(i in 1:n){
index_j<-matrix(rep(T,n+1),nrow=1)
index_j<-data.frame(index_j)
index_j[c(1,i+1)]<-c(i,1)
index_h<-index_j[2:(n+1)]
J[index_j]<-H[index_h]
index_j[i+1]<-2
J[index_j]<-H[index_h]
}
答案 0 :(得分:0)
好的,我已经回答了我自己的问题,但是我认为我会发布答案,以防万一有人觉得将来有用。
该解决方案使用函数 extract.array (程序包 R.utils )对子集数组和函数 abind (程序包 abind )组合数组。
这是带注释的代码:
Jlist<-vector("list",n)
for(i in 1:n){
index<-vector("list",n) #indices for each dimension of the array
for(j in 1:n){
if(j==i){index[[j]]<-1}else{index[[j]]<-1:2}
}
#all dimensions of the array H have index range 1:2
J_i<-extract.array(H,indices=index,drop=F)
#extracting the subset of H with the specified indices
Jlist[[i]]<-abind(J_i,J_i,along=i)
#combine two copies of J_i, which has index range = 1 in dimension i, along dimension i --> result has index range 1:2 in all dimensions, just like H
}
J<-abind(Jlist,along=0)
#Jlist has n entries, each an n-dimensional array with index range 1:2 in all dimensions. Use abind to combine these in a new dimension (along = 0) producing an array with n+1 dimensions where the first dimension has index range 1:n.