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.edouard at gmail.com>
To: arun <smartpink111 at 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 <smartpink111 at yahoo.com> wrote:
No problem.>Can I know the reason?
>Tx.
>
>
>
>
>
>
>
>________________________________
>From: Edouard Hardy <hardy.edouard at gmail.com>
>To: arun <smartpink111 at yahoo.com>
>Cc: "dcarlson at tamu.edu" <dcarlson at 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 <smartpink111 at 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 <dcarlson at tamu.edu>
>>To: 'Edouard Hardy' <hardy.edouard at gmail.com>; 'R
help' <r-help at 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-bounces at r-project.org
>>[mailto:r-help-bounces at 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 at 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 at 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.
>>
>>
>