Hi Christian:

Thanks a lot for your continuous help. This time you got the code right !
That's what I wanted :)
Great job!

Thanks & Regards,
Sauvik

On Sat, Aug 1, 2009 at 10:30 PM, Poersching <poerschin...@web.de> wrote:

> Hey,
> oh yes, but now I have realy the ultimate solution... ;-)
> Here it comes:
>
> 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))
>
> z<-apply(as.matrix(a),c(1,2),function(f1)
>    apply(as.matrix(d),c(1,2),function(f2)
>
>
> apply(DataArray_1[dimnames(DataArray_1)[[1]]==f1,,dimnames(DataArray_1)[[3]]==f2,],1,
> function(d1)
>
>
> apply(DataArray_2[dimnames(DataArray_2)[[1]]==f1,,dimnames(DataArray_2)[[3]]==f2,],1,
> function(d2)
>    cor(d1,d2))
> )))
> Correl = array(z, dim=c(length(c),length(b),
>  length(d),length(a)),dimnames=list(c,b,d,a))
> Correl<-aperm(Correl,c(4,2,1,3))
>
> So, best Regards,
> Christian
>
> Sauvik De schrieb:
> > Hi Christian:
> >
> > Many thank for the code.
> >
> > But I am afraid that your code still has a problem in terms of
> > providing correct correlation. For example, if you look at the
> > correlation between DataArray_1["A2","B1","D1",] and
> > DataArray_2["A2","C1","D1",] after running your code, you will notice
> > that this is actually the correlation between
> > DataArray_1["A2","B1","D1",] and DataArray_2["A1",C1","D1",] and so on.
> >
> > The code gives the correct result only in case where elements
> > corresponding to "A1" & "D1" are involved in DataArray_1 & DataArray_2.
> >
> > The problem is in
> >
> > Correl<-Correl[1:length(c),,,]
> >
> > We need to select elements of Correl more carefully to reach a proper
> > solution.
> >
> > Thanks,
> > Sauvik
> >
> >
> > On Wed, Jul 29, 2009 at 11:41 PM, Poersching <poerschin...@web.de
> > <mailto:poerschin...@web.de>> wrote:
> >
> >     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
> >     <poerschin...@web.de <mailto:poerschin...@web.de>
> >     >> <mailto:poerschin...@web.de <mailto:poerschin...@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<poerschin...@web.de <mailto:poerschin...@web.de>
> >     >>>     <mailto:poerschin...@web.de <mailto:poerschin...@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
> >     >>>     <ggrothendi...@gmail.com <mailto:ggrothendi...@gmail.com>
> >     <mailto:ggrothendi...@gmail.com <mailto:ggrothendi...@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.s...@gmail.com <mailto:sauvik.s...@gmail.com>
> >     <mailto:sauvik.s...@gmail.com <mailto:sauvik.s...@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@r-project.org <mailto:R-help@r-project.org>
> >     <mailto:R-help@r-project.org <mailto: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.
> >     >>>     >
> >     >>>     >
> >     >>>     >
> >     >>>     > [[alternative HTML version deleted]]
> >     >>>     >
> >     >>>     > ______________________________________________
> >     >>>     > R-help@r-project.org <mailto:R-help@r-project.org>
> >     <mailto:R-help@r-project.org <mailto: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.
> >     >>>     >
> >     >>>     >
> >     >>>     >
> >     >>>     > 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@r-project.org <mailto: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.
> >     >
> >     >
> >
> >
> >
>
>

        [[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