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.