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>> 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>> 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> >>> > >>> > >>> > 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>> 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> 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> 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 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. > > ______________________________________________ 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.