[R] General indexing in multidimensional arrays
Jannis
bt_jannis at yahoo.de
Thu Aug 4 12:33:05 CEST 2011
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.weylandt at 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_jannis at 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_jannis at 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 at 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 at 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.
>>>
>>
More information about the R-help
mailing list