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 <[email protected]> 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 <[email protected]>
> 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<[email protected]> 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<[email protected]> 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
>>>>>>
>>>>>> ______________________________******________________
>>>>>> [email protected] 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.
>>>>>>
>>>>>>
>>>>>> ______________________________****________________
>>>> [email protected] 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.
>>>>
>>>>
>>>
> ______________________________**________________
> [email protected] 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]]
______________________________________________
[email protected] 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.