[R] Determine the dimension-names of an element in an array in R
Poersching
Poersching79 at web.de
Sat Aug 1 19:00:12 CEST 2009
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 <Poersching79 at web.de
> <mailto:Poersching79 at 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
> <Poersching79 at web.de <mailto:Poersching79 at web.de>
> >> <mailto: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>
> >>> <mailto: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>
> <mailto: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>
> <mailto: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>
> <mailto: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>
> <mailto: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 <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.
> >
> >
>
>
>
More information about the R-help
mailing list