I'm just wondering.... When I use your function on your data I get a result that is not very intuitive. Is this what you were trying to do? (I took the liberty of setting dims to 3 since 'auto', 1, and 2 didn't work.
> 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=3) Var1 Var2 Var3 [1,] 1 1 4 [2,] 2 1 4 [3,] 3 1 4 [4,] 4 1 4 [5,] 1 2 4 [6,] 2 2 4 [7,] 3 2 4 [8,] 4 2 4 [9,] 1 3 4 [10,] 2 3 4 [11,] 3 3 4 [12,] 4 3 4 [13,] 1 4 4 [14,] 2 4 4 [15,] 3 4 4 [16,] 4 4 4 [17,] 1 1 1 [18,] 2 1 1 [19,] 3 1 1 [20,] 4 1 1 [21,] 1 2 1 [22,] 2 2 1 [23,] 3 2 1 [24,] 4 2 1 [25,] 1 3 1 [26,] 2 3 1 [27,] 3 3 1 [28,] 4 3 1 [29,] 1 4 1 [30,] 2 4 1 [31,] 3 4 1 [32,] 4 4 1 On Thu, Aug 4, 2011 at 5:33 AM, Jannis <bt_jan...@yahoo.de> wrote: > Thanks, Michael. I was, however, after a function I coul use for both > extracting and replacing subarrays. In case anybody else stumbles over this > problem, here is my solution. Its programming is most probably horribly > clumsy: > > > 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 dimesnions 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 == '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.nonapply <- setdiff(1:length(dim(datacube)**),dims) > ind.matrix <- which(logical.ind, arr.ind = TRUE) > > args.expand.grid <- list() > counter = 1 > for (i in 1: length(dim(datacube))) > { > if (is.element(i,dims.nonapply)) { > args.expand.grid[[i]] = 1:dim(datacube)[dims.nonapply[**i]] > } else { > args.expand.grid[[i]] = ind.matrix[,counter] > counter = counter + 1 > } > } > > ind.all <- as.matrix(do.call(expand.grid, args.expand.grid)) > ind.matrix <- ind.all[,order(c(dims.**nonapply,dims))] > > } > ##value<< integer index matrix which can be used to index datacube > ind.matrix > > } > > > On 08/04/2011 12:12 AM, R. Michael Weylandt <michael.weyla...@gmail.com> > wrote: > >> This might be a little late: but how about this (slightly clumsy) >>> function: >>> >>> putValues<- function(Insert, Destination, Location) { >>> Location = as.matrix(Location) >>> Location = array(Location,dim(**Destination)) >>> Destination[Location]<- Insert >>> return(Destination) >>> } >>> >>> It currently assumes that the location array lines up in dimension order, >>> but other than that seems to work pretty well. If you want, it shouldn't >>> be >>> hard to change it to take in a set of dimensions to arrange Location >>> along. >>> If you like any of the other suggested behaviors, you could put in a >>> is.null(Insert) option that returns the desired subset of values. I >>> haven't >>> tested it completely, but for a few sample inputs, it seems be do as >>> desired. >>> >>> Michael >>> >>> >>> On Wed, Aug 3, 2011 at 5:00 PM, Jannis<bt_jan...@yahoo.de> wrote: >>> >>> Thanks for all the replies!Unfortunately the solutions only work for >>>> extracting subsets of the data (which was exactly what I was asking for) >>>> and >>>> not to replace subsets with other values. I used them, however, to >>>> program a >>>> rather akward function to do that. Seems I found one of the few aspects >>>> where Matlab actually is slightly easier to use than R. >>>> >>>> >>>> Thanks for your help! >>>> Jannis >>>> >>>> On 08/01/2011 05:50 PM, Gene Leynes wrote: >>>> >>>> What do you think about this? >>>>> >>>>> apply(data, 3, '[', indices) >>>>> >>>>> >>>>> On Mon, Aug 1, 2011 at 4:38 AM, Jannis<bt_jan...@yahoo.de> wrote: >>>>> >>>>> Dear R community, >>>>> >>>>>> >>>>>> I have a general question regarding indexing in multidiemensional >>>>>> arrays. >>>>>> >>>>>> Imagine I have a three dimensional array and I only want to extract on >>>>>> vector along a single dimension from it: >>>>>> >>>>>> >>>>>> data<- array(rnorm(64),dim=c(4,4,4)) >>>>>> >>>>>> result<- data[1,1,] >>>>>> >>>>>> If I want to extract more than one of these vectors, it would now >>>>>> really >>>>>> help me to supply a logical matrix of the size of the first two >>>>>> dimensions: >>>>>> >>>>>> >>>>>> indices<- matrix(FALSE,ncol=4,nrow=4) >>>>>> indices[1,3]<- TRUE >>>>>> indices[4,1]<- TRUE >>>>>> >>>>>> result<- data[indices,] >>>>>> >>>>>> This, however would give me an error. I am used to this kind of >>>>>> indexing >>>>>> from Matlab and was wonderingt whether there exists an easy way to do >>>>>> this >>>>>> in R without supplying complicated index matrices of all three >>>>>> dimensions or >>>>>> logical vectors of the size of the whole matrix? >>>>>> >>>>>> The only way I could imagine would be to: >>>>>> >>>>>> result<- data[rep(as.vector(indices),******times=4)] >>>>>> >>>>>> but this seems rather complicated and also depends on the order of the >>>>>> dimensions I want to extract. >>>>>> >>>>>> >>>>>> I do not want R to copy Matlabs behaviour, I am just wondering whether >>>>>> I >>>>>> missed one concept of indexing in R? >>>>>> >>>>>> >>>>>> >>>>>> Thanks a lot >>>>>> Jannis >>>>>> >>>>>> ______________________________******________________ >>>>>> R-help@r-project.org mailing list >>>>>> https://stat.ethz.ch/mailman/******listinfo/r-help<https://stat.ethz.ch/mailman/****listinfo/r-help> >>>>>> <https://**stat.ethz.ch/mailman/****listinfo/r-help<https://stat.ethz.ch/mailman/**listinfo/r-help> >>>>>> > >>>>>> <https://stat.**ethz.ch/**mailman/listinfo/r-**help<http://ethz.ch/mailman/listinfo/r-**help> >>>>>> <http**s://stat.ethz.ch/mailman/**listinfo/r-help<https://stat.ethz.ch/mailman/listinfo/r-help> >>>>>> > >>>>>> PLEASE do read the posting guide http://www.R-project.org/** >>>>>> posting-guide.html<http://www.****R-project.org/posting-guide.** >>>>>> **html<http://www.R-project.**org/posting-guide.html<http://www.R-project.org/posting-guide.html> >>>>>> > >>>>>> and provide commented, minimal, self-contained, reproducible code. >>>>>> >>>>>> >>>>>> ______________________________****________________ >>>> R-help@r-project.org mailing list >>>> https://stat.ethz.ch/mailman/****listinfo/r-help<https://stat.ethz.ch/mailman/**listinfo/r-help> >>>> <https://stat.**ethz.ch/mailman/listinfo/r-**help<https://stat.ethz.ch/mailman/listinfo/r-help> >>>> > >>>> PLEASE do read the posting guide http://www.R-project.org/** >>>> posting-guide.html<http://www.**R-project.org/posting-guide.**html<http://www.R-project.org/posting-guide.html> >>>> > >>>> and provide commented, minimal, self-contained, reproducible code. >>>> >>>> >>> > ______________________________**________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/**listinfo/r-help<https://stat.ethz.ch/mailman/listinfo/r-help> > PLEASE do read the posting guide http://www.R-project.org/** > posting-guide.html <http://www.R-project.org/posting-guide.html> > and provide commented, minimal, self-contained, reproducible code. > [[alternative HTML version deleted]] ______________________________________________ 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.