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.

Reply via email to