Hi Edouard,
In terms of speed, your new solution may not be that much different from the old one: #####large matrix M<- 10 N<- 1e3 set.seed(249) A<- matrix(sample(1:10,1e5*4,replace=TRUE),1e5,4) B<- matrix(NA,ncol=ncol(A),nrow=0) system.time({ set.seed(54) for (i in 1 : N) B <- rbind(B, apply(A[sample(1 : nrow(A), M, replace = T),], 2, prod)) }) # user system elapsed # 0.240 0.048 0.290 system.time({ set.seed(54) res<- do.call(rbind,lapply(1:N,function(x) {A1<-A[sample.int(nrow(A),M,replace=TRUE),]; tapply(as.vector(A1),list(rep(seq_len(ncol(A1)),each=nrow(A1))),prod)})) }) # user system elapsed # 0.300 0.000 0.302 dimnames(res)<- dimnames(B) identical(res,B) #[1] TRUE B1<- matrix(NA,ncol=ncol(A),nrow=0) system.time({ set.seed(54) for(i in 1:N) { A1<-A[sample.int(nrow(A),M,replace=TRUE),] B1<- rbind(B1,tapply(as.vector(A1),list(rep(seq_len(ncol(A1)),each=nrow(A1))),prod)) } }) # user system elapsed # 0.312 0.008 0.318 system.time({ set.seed(54) l<-tapply(rep(M,N),1:N,function(x){A[sample(1:nrow(A), M, replace = T), ]}) B2<-t(sapply(l,apply,2,prod)) }) # user system elapsed # 0.156 0.136 0.290 dimnames(B1)<- dimnames(B2) identical(B1,B2) #[1] TRUE library(matrixStats) system.time({ set.seed(54) B3<-do.call(rbind, lapply(1:N, function(x) colProds(A[sample.int(nrow(A), M, replace=TRUE),]))) }) # user system elapsed # 0.152 0.000 0.155 dimnames(B3)<- dimnames(B2) all.equal(B2,B3) #[1] TRUE A.K. ________________________________ From: Edouard Hardy <hardy.edou...@gmail.com> To: arun <smartpink...@yahoo.com> Sent: Wednesday, September 4, 2013 1:31 PM Subject: Re: [R] Random products of rows in a matrix I am not allowed to. I found a solution : l<-tapply(rep(M,N),1:N,function(x){A[sample(1 : nrow(A), M, replace = T), ]}) t(sapply(l,apply,2,prod)) Edouard Hardy On Wed, Sep 4, 2013 at 5:38 PM, arun <smartpink...@yahoo.com> wrote: No problem. >Can I know the reason? >Tx. > > > > > > > >________________________________ >From: Edouard Hardy <hardy.edou...@gmail.com> >To: arun <smartpink...@yahoo.com> >Cc: "dcarl...@tamu.edu" <dcarl...@tamu.edu> >Sent: Wednesday, September 4, 2013 11:32 AM > >Subject: Re: [R] Random products of rows in a matrix > > > >Hello and thank you for your help. >Unfortunately, I cannot use any package... > > > >Edouard Hardy > > > >On Wed, Sep 4, 2013 at 4:52 PM, arun <smartpink...@yahoo.com> wrote: > > >> >>HI Edouard, >> >>Is there any limitations in installing a package? >> >>Using David's solution, if you could install, >>library(matrixStats) >>set.seed(28) >> A<- matrix(sample(1:10,5*4,replace=TRUE),5,4) >> >>B <- matrix(NA, ncol = ncol(A), nrow = 0) >>N<- 3 >>M<- nrow(A) >>set.seed(54) >> >>for (i in 1 : N) B <- rbind(B, apply(A[sample(1 : nrow(A), M, replace = T), >>], 2, prod)) >> >> set.seed(54) >> B1<- do.call(rbind, lapply(1:N, function(x) >> colProds(A[sample.int(nrow(A), M, replace=TRUE),]))) >> all.equal(B,B1) >>#[1] TRUE >>A.K. >> >> >> >> >>----- Original Message ----- >>From: David Carlson <dcarl...@tamu.edu> >>To: 'Edouard Hardy' <hardy.edou...@gmail.com>; 'R help' <r-help@r-project.org> >>Cc: >>Sent: Wednesday, September 4, 2013 10:34 AM >>Subject: Re: [R] Random products of rows in a matrix >> >>Actually you have two loops, the for() loop you created and the >>loop that is hidden inside apply(). You can hide the first loop >>with lapply() or sapply(): >> >>B <- do.call(rbind, lapply(1:N, function(x) >>colSums(A[sample.int(nrow(A), M, replace=TRUE),]))) >> >>Or >> >>B <- t(sapply(1:N, function(x) colSums(A[sample.int(nrow(A), M, >>replace=TRUE),]))) >> >>You could eliminate the apply() loop by taking log(A), using >>colSums(), and then converting back with exp(). >> >>------------------------------------- >>David L Carlson >>Associate Professor of Anthropology >>Texas A&M University >>College Station, TX 77840-4352 >> >>-----Original Message----- >>From: r-help-boun...@r-project.org >>[mailto:r-help-boun...@r-project.org] On Behalf Of Edouard Hardy >>Sent: Wednesday, September 4, 2013 2:59 AM >>To: R help >>Subject: [R] Random products of rows in a matrix >> >>Hello everybody, >> >>Without any loop and any package, >> >>I would like to return N products of M rows in a matrix A : >> >>Today, I managed to do it with a loop : >> >>B <- matrix(NA, ncol = ncol(A), nrow = 0) >>for (i in 1 : N) B <- rbind(B, apply(A[sample(1 : nrow(A), M, >>replace = T), >>], 2, prod)) >> >>Do you have a solution ? >> >>Thank you in advance ! >> >> [[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. >> >>______________________________________________ >>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.