HI, In my first solutions: n<-3 t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),n,nrow(Anew)))),colProds)) # [,1] [,2] [,3] #1 28 80 162 #2 162 80 28 #3 1 3 5 n<-4 t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),n,nrow(Anew)))),colProds)) # [,1] [,2] [,3] #1 252 640 1134 #2 18 30 20
A.K. ________________________________ From: Edouard Hardy <hardy.edou...@gmail.com> To: arun <smartpink...@yahoo.com> Cc: Bert Gunter <gunter.ber...@gene.com>; R help <r-help@r-project.org> Sent: Monday, September 2, 2013 11:46 AM Subject: Re: [R] Product of certain rows in a matrix Thank you all for your responses. The real problem is that all your answer work for products 2 by 2. I now have to do the product n by n row. Do you have a solution ? Thank you in advance, E.H. Edouard Hardy On Mon, Sep 2, 2013 at 5:43 PM, arun <smartpink...@yahoo.com> wrote: I guess in such situations, > > >fun1<- function(mat){ > if(nrow(mat)%%2==0){ > j<- 2*seq_len(nrow(mat)/2) > b<- mat[j,]* mat[j-1,] > } > else {mat1<- mat[-nrow(mat),] > j<- 2*seq_len(nrow(mat1)/2) > b<- rbind(mat1[j,]*mat1[j-1,],mat[nrow(mat),]) > } >b >} >fun1(A) ># [,1] [,2] [,3] > >#[1,] 4 10 18 >#[2,] 63 64 63 >#[3,] 18 10 4 > fun1(Anew) ># [,1] [,2] [,3] > >#[1,] 4 10 18 >#[2,] 63 64 63 >#[3,] 18 10 4 >#[4,] 1 3 5 > > >A.K. > > > > >----- Original Message ----- >From: arun <smartpink...@yahoo.com> >To: Bert Gunter <gunter.ber...@gene.com> >Cc: R help <r-help@r-project.org> > >Sent: Monday, September 2, 2013 11:26 AM >Subject: Re: [R] Product of certain rows in a matrix > >Hi Bert, >Thanks. It is a better solution. > >If nrow() is not even. > >Anew<- rbind(A,c(1,3,5)) >j<-seq_len(nrow(Anew)/2)### > Anew[j,]*Anew[j-1,] >#Error in Anew[j, ] * Anew[j - 1, ] : non-conformable arrays > >t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),2,7))),colProds)) > [,1] [,2] [,3] >1 4 10 18 >2 63 64 63 >3 18 10 4 >4 1 3 5 > >A.K. > > > > > > >________________________________ >From: Bert Gunter <gunter.ber...@gene.com> >To: arun <smartpink...@yahoo.com> >Cc: R help <r-help@r-project.org> >Sent: Monday, September 2, 2013 10:55 AM >Subject: Re: [R] Product of certain rows in a matrix > > > >These elaborate manipulations are unnecessary and inefficient. Use indexing >instead: > >j <- 2*seq_len(nrow(A)/2) >b <- A[j,]*A[j-1,] >b >[,1] [,2] [,3] >[1,] 4 10 18 >[2,] 63 64 63 >[3,] 18 10 4 > >[,1] [,2] [,3] >[1,] 4 10 18 >[2,] 63 64 63 >[3,] 18 10 4 >[,1] [,2] [,3] >[1,] 4 10 18 >[2,] 63 64 63 >[3,] 18 10 4[,1] [,2] [,3] >[1,] 4 10 18 >[2,] 63 64 63 >[3,] 18 10 4 >[,1] [,2] [,3] >[1,] 4 10 18 >[2,] 63 64 63 >[3,] 18 10 4 > > > > > >On Mon, Sep 2, 2013 at 7:25 AM, arun <smartpink...@yahoo.com> wrote: > >Hi, >>You could try: >> >>A<- matrix(unlist(read.table(text=" >>1 2 3 >>4 5 6 >>7 8 9 >>9 8 7 >>6 5 4 >>3 2 1 >>",sep="",header=FALSE)),ncol=3,byrow=FALSE,dimnames=NULL) >> >>library(matrixStats) >> res1<-t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),colProds)) >> res1 >># [,1] [,2] [,3] >>#1 4 10 18 >>#2 63 64 63 >>#3 18 10 4 >> >> >> >>res2<-t(sapply(split(as.data.frame(A),((seq_len(nrow(A))-1)%/%2)+1),colProds)) >> identical(res1,res2) >>#[1] TRUE >> >>#or >> t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),function(x) >>apply(x,2,prod))) >> >>#or >>library(plyr) >> >>as.matrix(ddply(as.data.frame(A),.(as.numeric(gl(nrow(A),2,6))),colProds)[,-1]) >># V1 V2 V3 >>#[1,] 4 10 18 >>#[2,] 63 64 63 >>#[3,] 18 10 4 >> >>#or >>do.call(rbind,tapply(seq_len(nrow(A)),list(as.numeric(gl(nrow(A),2,6))),FUN=function(x) >> colProds(A[x,]))) >>#or >>A1<- data.frame(A,ID=as.numeric(gl(nrow(At),2,6))) >> aggregate(A1[,-4],list(A1[,4]),colProds)[,-1] >># X1 X2 X3 >>#1 4 10 18 >>#2 63 64 63 >>#3 18 10 4 >> >>#or >>library(data.table) >>At<- data.table(A1,key='ID') >>subset(At[,lapply(.SD,colProds),by=ID],select=-1) >># X1 X2 X3 >>#1: 4 10 18 >>#2: 63 64 63 >>#3: 18 10 4 >> >>A.K. >> >> >> >> >>Hello, >> >>I have this matrix : >>A = >>1 2 3 >>4 5 6 >>7 8 9 >>9 8 7 >>6 5 4 >>3 2 1 >> >>I would like to have this matrix (product of rows 2 by 2) : >>A = >>4 10 18 >>63 64 63 >>18 10 4 >> >>Is it possible to do that without a loop ? >> >>Thank you in advance ! >> >>______________________________________________ >>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. >> > > >-- > > >Bert Gunter >Genentech Nonclinical Biostatistics > >Internal Contact Info: >Phone: 467-7374 >Website: > >http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm > >______________________________________________ >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.