Thanks, Gene, for your hint! I indeed did not check any possible situation and my function was not returning what I intened it to return. This updated version, however, should. I am sure there are much easier ways (or ready made functions) to do the same.


ind.datacube = function(
##title<< create logical index matrices for multidimensional datacubes
  datacube       ##<< array: datacube from which to extract the subparts
, logical.ind ##<< logical array: TRUE/FALSE index matrix for a subset of the dimensions ## of datacube. The size of logical.ind`s dimesnions has to match the
                 ##   sizes of the corresponding dimensions in datacube.
, dims='auto' ##<< integer vector or 'auto' : indices of the dimensions in datacube corresponding ## to the dimensions of logical.ind. If set to 'auto' this matching is tried to ## be accomplished by comparing the sizes of the dimensions of the two objects.
)
{
    if (sum(logical.ind) == 0) {
        stop('No TRUE value in index matrix!')
    } else {
        if (dims[1] == 'auto')
        {
            if (is.null(dim(logical.ind)[1])) {
                size.ind     = length(logical.ind)
                logical.ind  = matrix(logical.ind,ncol=1)
            } else {
                size.ind = dim(logical.ind)
            }
            dims = match(size.ind, dim(datacube))
if (sum(duplicated(size.ind)) > 0 || sum(duplicated(dims)) > 0 ) stop('dimensions do not match unambigously. Supply dims manually!')
        }
        dims.all <- setdiff(1:length(dim(datacube)),dims)
        ind.matrix.choice <- which(logical.ind, arr.ind = TRUE)

        dims.all.expand <- list()
        for (i in 1:length(dims.all))
           dims.all.expand[[i]] <- 1:dim(datacube)[dims.all[i]]
dims.all.grid <- as.matrix(do.call(expand.grid, dims.all.expand))

expgrid.dims.all <- as.matrix(do.call(expand.grid, dims.all.expand)) dims.all.mat <- matrix(rep(dims.all.grid,times=2),ncol=length(dims.all)) ind.matrix.all <- cbind(ind.matrix.choice[rep(1:dim(ind.matrix.choice)[1],each=dim(dims.all.grid)[1]),] ,
                                dims.all.mat)
        ind.matrix.ord <- ind.matrix.all[,order(c(dims,dims.all))]
    }
    colnames(ind.matrix.ord) <- paste('dim',1:length(dim(datacube)),sep='')
    ##value<< integer index matrix which can be used to index datacube
    ind.matrix.ord
}


data <- array(rnorm(64),dim=c(4,4,4))
indices <- matrix(FALSE,ncol=4,nrow=4)
indices[1,3] <- TRUE
indices[4,1] <- TRUE
#result <- data[indices,]
ind.datacube(data, indices, dims=c(1,2))




On 08/04/2011 09:20 PM, Gene Leynes wrote:
data<- array(rnorm(64),dim=c(4,4,4))

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to