[R] Determine the dimension-names of an element in an array in R
Poersching
Poersching79 at web.de
Wed Jul 29 20:11:05 CEST 2009
Hey,
i have forgotten to generalize the code so
Correl<-Correl[1:4,,,]
must be
Correl<-Correl[1:length(c),,,]
it's because the comparison levels. I think you don't want the
correlation betweeen A1, B1, D1 and A2, C1, D1 ,
but between A1, B1, D1 and A1, C1, D1 or between A1, B1, D1 and A1, C2, D1.
So the "1:length(c)" writes only the correlation between the B and C out
of the whole correlation array.
That's also why the sequence in the second apply function is changed.
Regards Christian.
Poersching schrieb:
> Hey,
> I think I have a solution for your problem:
>
> Correl<-apply(DataArray_1,1:3, function(d1)
> apply(DataArray_2,c(2,1,3), function(d) cor(d1,d))
> )
> Correl<-Correl[1:4,,,]
> dimnames(Correl)[[1]]<-c
> Correl<-aperm(Correl,c(2,3,1,4))
>
> This one should work. :-)
>
> Best Regards,
> Christian
>
> Sauvik De schrieb:
>
>> Hi there,
>>
>> Thanks again for your reply. I know for-loop is always a solution to
>> my problem and I had already coded using for-loop. But the number of
>> levels for each dimension is large enough in actual problem and hence
>> it was time-consuming.
>> So, I was just wondering if there are any other alternative way-outs
>> to solving my problem. That's why I tried with apply functions
>> (sapply)assuming that this might work out faster even fractionally as
>> compared to for-loop.
>>
>> Cheers,
>> Sauvik
>>
>> On Mon, Jul 27, 2009 at 12:28 AM, Poersching <Poersching79 at web.de
>> <mailto:Poersching79 at web.de>> wrote:
>>
>> Sauvik De schrieb:
>>
>>> Hi:
>>> Lots of thanks for your valuable time!
>>>
>>> But I am not sure how you would like to use the function in this
>>> situation.
>>>
>>> As I had mentioned that the first element of my output array
>>> should be like:
>>>
>>> cor(DataArray_1[dimnames(Correl)[[1]][1],dimnames(Correl)[[2]][1],dimnames(Correl)[[4]][1],],DataArray_2[dimnames(Correl)[[1]][1],dimnames(Correl)[[3]][1],dimnames(Correl)[[4]][1],],use="pairwise.complete.obs")
>>>
>>> in my below code.
>>>
>>> and
>>>
>>> the output array of correlation I wish to get using "sapply" as
>>> follows:
>>>
>>> Correl = sapply(Correl,function(d)
>>> cor(DataArray_1[...],DataArray_2[...],
>>> use="pairwise.complete.obs"))
>>>
>>> So it would be of great help if you could kindly specify how to
>>> utilise your function "findIndex" in ...
>>>
>>> Apologies for all this!
>>>
>>> Thanks & Regards,
>>> Sauvik
>>>
>>>
>> Hey,
>> sorry, I haven't understood your problem last time, but now this
>> solution should solve your problem, so I hope. :-)
>> It's only a for to loop, but an apply function may work too. I
>> will think about this, but for now... ;-)
>>
>> la<-length(a)
>> lb<-length(b)
>> lc<-length(c)
>> ld<-length(d)
>> for (ia in 1:la) {
>> for (ib in 1:lb) {
>> for (ic in 1:lc) {
>> for (id in 1:ld) {
>> Correl[ia,ib,ic,id]<-cor(
>> DataArray_1[dimnames(Correl)[[1]][ia],
>> dimnames(Correl)[[2]][ib],
>> dimnames(Correl)[[4]][id],]
>> ,
>> DataArray_2[dimnames(Correl)[[1]][ia],
>> dimnames(Correl)[[3]][ic],
>> dimnames(Correl)[[4]][id],]
>> ,
>> use="pairwise.complete.obs")
>> }
>> }
>> }
>> }
>> ## with function findIndex you can find the dimensions with
>> ## i.e. cor values greater 0.5 or smaller -0.5, like:
>> findIndex(Correl,Correl[Correl>0.5])
>> findIndex(Correl,Correl[Correl<(-0.5)])
>>
>> I have changed the code of the function findIndex in line which
>> contents: el[j]<-which(is.element(data,element[j]))
>>
>> Rigards,
>> Christian
>>
>>
>>> On Sun, Jul 26, 2009 at 3:54 PM, Poersching<Poersching79 at web.de
>>> <mailto:Poersching79 at web.de>> wrote:
>>> > Sauvik De schrieb:
>>> >
>>> > Hi Gabor:
>>> > Many thanks for your prompt reply!
>>> > The code is fine. But I need it in more general form as I had
>>> mentioned that
>>> > I need to input any 0 to find its dimension-names.
>>> >
>>> > Actually, I was using "sapply" to calculate correlation and
>>> this idea was
>>> > required in the middle of correlation calculation.
>>> > I am providing the way I tried my calculation.
>>> >
>>> > a= c("A1","A2","A3","A4","A5")
>>> > b= c("B1","B2","B3")
>>> > c= c("C1","C2","C3","C4")
>>> > d= c("D1","D2")
>>> > e= c("E1","E2","E3","E4","E5","E6","E7","E8")
>>> >
>>> > DataArray_1 = array(c(rnorm(240)),dim=c(length(a),length(b),
>>> > length(d),length(e)),dimnames=list(a,b,d,e))
>>> > DataArray_2 = array(c(rnorm(320)), dim=c(length(a),length(c),
>>> > length(d),length(e)),dimnames=list(a,c,d,e))
>>> >
>>> > #Defining an empty array which will contain the correlation
>>> values (output
>>> > array)
>>> > Correl = array(NA, dim=c(length(a),length(b),
>>> > length(c),length(d)),dimnames=list(a,b,c,d))
>>> >
>>> > #Calculating Correlation between attributes b & c over values of e
>>> > Correl = sapply(Correl,function(d)
>>> cor(DataArray_1[...],DataArray_2[...],
>>> > use="pairwise.complete.obs"))
>>> >
>>> > This is where I get stuck.
>>> > In the above, d is acting as an element in the "Correl" array.
>>> Hence I need
>>> > to get the dimension-names for d.
>>> >
>>> > #The first element of Correl will be:
>>> >
>>> cor(DataArray_1[dimnames(Correl)[[1]][1],dimnames(Correl)[[2]][1],dimnames(Correl)[[4]][1],],DataArray_2[dimnames(Correl)[[1]][1],dimnames(Correl)[[3]][1],dimnames(Correl)[[4]][1],],use="pairwise.complete.obs")
>>> >
>>> > So my problem boils down to extracting the dim-names in terms
>>> of element(d)
>>> > and not in terms of Correl (that I have mentioned as "..." in
>>> the above
>>> > code)
>>> >
>>> > My sincere thanks for your valuable time & suggestions.
>>> >
>>> > Many Thanks & Kind Regards,
>>> > Sauvik
>>> >
>>> >
>>> > On Sun, Jul 26, 2009 at 5:26 AM, Gabor Grothendieck
>>> <ggrothendieck at gmail.com <mailto:ggrothendieck at gmail.com>
>>> >
>>> >
>>> > wrote:
>>> >
>>> >
>>> >
>>> >
>>> > Try this:
>>> >
>>> >
>>> >
>>> > ix <- c(1, 3, 4, 2)
>>> > mapply("[", dimnames(mydatastructure), ix)
>>> >
>>> >
>>> > [1] "S1" "T3" "U4" "V2"
>>> >
>>> >
>>> > On Sat, Jul 25, 2009 at 5:12 PM, Sauvik
>>> De<sauvik.stat at gmail.com <mailto:sauvik.stat at gmail.com>> wrote:
>>> >
>>> >
>>> > Hi:
>>> > How can I extract the dimension-names of a pre-defined element in a
>>> > multidimensional array in R ?
>>> >
>>> > A toy example is provided below:
>>> > I have a 4-dimensional array with each dimension having certain
>>> length.
>>> >
>>> >
>>> > In
>>> >
>>> >
>>> > the below example, "mydatastructure" explains the structure of
>>> my data.
>>> >
>>> > mydatastructure = array(0,
>>> >
>>> >
>>> > dim=c(length(b),length(z),length(x),length(d)),
>>> >
>>> >
>>> > dimnames=list(b,z,x,d))
>>> >
>>> > where,
>>> > b=c("S1","S2","S3","S4","S5")
>>> > z=c("T1","T2", "T3")
>>> > x=c("U1","U2","U3","U4")
>>> > d=c("V1","V2")
>>> >
>>> > Clearly, "mydatastructure" contains many 0's.
>>> > Now how can I get the dimension-names of any particular 0 ?
>>> > That is, my input should be a particular 0 in the array
>>> "mydatastructure"
>>> > (Suppose this 0 corresponds to S1,T3,U4 & V2 in the array). Then my
>>> >
>>> >
>>> > output
>>> >
>>> >
>>> > should be S1,T3,U4 & V2.
>>> >
>>> > The function "dimnames" didn't help me with the solution.
>>> > Any idea will greatly be appreciated.
>>> >
>>> > Thanks for your time!
>>> >
>>> > Kind Regards,
>>> > Sauvik
>>> >
>>> > [[alternative HTML version deleted]]
>>> >
>>> > ______________________________________________
>>> > R-help at r-project.org <mailto:R-help at 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.
>>> >
>>> >
>>> >
>>> > [[alternative HTML version deleted]]
>>> >
>>> > ______________________________________________
>>> > R-help at r-project.org <mailto:R-help at 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.
>>> >
>>> >
>>> >
>>> > Hey,
>>> >
>>> > I have spend some time to write a function, which should
>>> fulfill your needs.
>>> > so i hope ;-)
>>> >
>>> > findIndex<-function(data,element) {
>>> > ld<-length(data)
>>> > el<-which(is.element(data,element))
>>> > lel<-length(el)
>>> > ndim<-length(dim(data))
>>> > ind<-array(,dim=c(lel,ndim),dimnames=list(el,1:ndim))
>>> > precomma<-""
>>> > tempdata<-data
>>> > tempel<-el
>>> > for (j in 1:lel) {
>>> > data<-tempdata
>>> > el<-tempel
>>> > ld<-length(data)
>>> > for (i in ndim:1) {
>>> > ratio<-el[j]/(ld/dim(data)[i])
>>> > if (ratio-trunc(ratio)>0) {
>>> > ind[j,i]<-trunc(ratio)+1
>>> > } else {
>>> > ind[j,i]<-trunc(ratio)
>>> > }
>>> > if (length(dim(data))>1) {
>>> > k<-1
>>> > while (k>=1 & k<=(i-1)) {
>>> > precomma<-paste(precomma,",",sep="")
>>> > k<-k+1
>>> > }
>>> >
>>> >
>>> data<-as.array(eval(parse(text=paste("data[",precomma,ind[j,i],"]",sep=""))))
>>> > precomma<-""
>>> > ld<-length(data)
>>> > el[j]<-which(is.element(data,element[j]))
>>>
>>> > }
>>> > }
>>> > }
>>> > return(ind)
>>> > }
>>> >
>>> > Regards,
>>> > Christian Porsche
>>> >
>>>
>>>
>>
>
> ______________________________________________
> R-help at 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.
>
>
More information about the R-help
mailing list