Re: [R] Determine the dimension-names of an element in an array in R
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 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 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[Correl0.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, Poerschingpoerschin...@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
Re: [R] Determine the dimension-names of an element in an array in R
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
Re: [R] Determine the dimension-names of an element in an array in R
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 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[Correl0.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, Poerschingpoerschin...@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 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 Desauvik.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
Re: [R] Determine the dimension-names of an element in an array in R
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 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 Desauvik.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 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.
Re: [R] Determine the dimension-names of an element in an array in R
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 On Sun, Jul 26, 2009 at 3:54 PM, Poerschingpoerschin...@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 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 Desauvik.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 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. 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
[R] Determine the dimension-names of an element in an array in R
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 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.