(I was just about to send this before your last reply) As a more general tip, I find that using %in% is easier to understand than "is.element" and "setdiff" because it can be more universal, especially when combined with "all" and the "!". To me the functions like setdiff are easier to read, but harder to interpret....
Example: x = letters[1:5] y = letters[3:14] is.element(x,y) ## Similar to is.element(i,dims.nonapply) x %in% y ## Same as i %in% dims.nonapply all(x %in% y[1:2]) all(y[1:2] %in% x) ## Similar to setdiff(1:length(dim(datacube)),dims) setdiff(x,y) x[!x %in% y] 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.