nevil amos
2020-Apr-01 01:18 UTC
[R] repeat rows of matrix by number (k) in one colummatrix adding column j with values 1:k
Hi I can achieve this using two for loops but it is slow I need to do this on many matrices with tens of millions of rows of x,y,z and k What is a faster method to achieve this, I cannot use rep as j changes in each row of the new matrix ############################################### M<-matrix(c(1,2,3,4,1,2,3,4,1,2,3,4, 2, 1, 3, 2 ), 4,4, dimnames = list(NULL, c("x", "y", "z","k"))) Print(M) #Create matrix (Mout) in this case 8 rows with x,y,z in each row of M #repeated k times with column j numbered from 1:k # ! can do with nested loops but this is very slow ( example below) #How do I acheive this quickly without loops? Mout<-NULL for(i in 1:nrow(M)){ a=M[i,c("x","y","z")] for (j in 1:M[i,"k"]){ b=c(a,j) Mout<-rbind(Mout,b) } } colnames(Mout)[4]<-"j" print(Mout) ######################################################### Thanks Nevil Amos [[alternative HTML version deleted]]
Jeff Newmiller
2020-Apr-01 01:33 UTC
[R] repeat rows of matrix by number (k) in one colummatrix adding column j with values 1:k
False premise: rep works fine Mout2 <- cbind(M[ rep(seq.int(nrow(M)),M[,"k"]), c("x","y","z")],unlist(lapply(M[,"k"],seq.int))) On March 31, 2020 6:18:37 PM PDT, nevil amos <nevil.amos at gmail.com> wrote:>Hi > >I can achieve this using two for loops but it is slow I need to do >this on >many matrices with tens of millions of rows of x,y,z and k > >What is a faster method to achieve this, I cannot use rep as j changes >in >each row of the new matrix >############################################### >M<-matrix(c(1,2,3,4,1,2,3,4,1,2,3,4, 2, 1, 3, 2 >), 4,4, dimnames = list(NULL, c("x", "y", "z","k"))) > >Print(M) >#Create matrix (Mout) in this case 8 rows with x,y,z in each row of M >#repeated k times with column j numbered from 1:k ># ! can do with nested loops but this is very slow ( example below) >#How do I acheive this quickly without loops? >Mout<-NULL > >for(i in 1:nrow(M)){ > a=M[i,c("x","y","z")] > for (j in 1:M[i,"k"]){ > b=c(a,j) > Mout<-rbind(Mout,b) > } >} >colnames(Mout)[4]<-"j" >print(Mout) > >######################################################### > >Thanks > >Nevil Amos > > [[alternative HTML version deleted]] > >______________________________________________ >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >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.-- Sent from my phone. Please excuse my brevity.
nevil amos
2020-Apr-01 02:42 UTC
[R] repeat rows of matrix by number (k) in one colummatrix adding column j with values 1:k
Well, I found a way to do it partly using rep(), and one loop that makes it 10x or more faster however would still be good to do without the loop at all matrix made slightly beigger (10000 rows): M<-matrix(c(1:30000 ), 10000,3) M<-cbind(M,sample(1:5,size = 10000,replace = T)) #Print(M) #Create matrix (Mout) in this case 8 rows with x,y,z in each row of M #repeated k times with column j numbered from 1:k # ! can do with nested loops but this is very slow ( example below) #How do I acheive this quickly without loops? print("double loop") print(system.time({ Mout<-NULL for(i in 1:nrow(M)){ a=M[i,1:3] k=M[i,4] for (j in 1:k){ b=c(a,j) Mout<-rbind(Mout,b) } } colnames(Mout)<-c("x","y","z","j") })) print("rep and single loop") print(system.time({ j<-NULL MOut<-NULL MOut<-M[,1:3][rep(1:nrow(M), times = M[,4]), ] for(i in M[,4])(j<-c(j,1:i)) MOut<-cbind(MOut,j) colnames(Mout)<-c("x","y","z","j") })) On Wed, 1 Apr 2020 at 12:18, nevil amos <nevil.amos at gmail.com> wrote:> Hi > > I can achieve this using two for loops but it is slow I need to do this > on many matrices with tens of millions of rows of x,y,z and k > > What is a faster method to achieve this, I cannot use rep as j changes in > each row of the new matrix > ############################################### > M<-matrix(c(1,2,3,4,1,2,3,4,1,2,3,4, 2, 1, 3, 2 > ), 4,4, dimnames = list(NULL, c("x", "y", "z","k"))) > > Print(M) > #Create matrix (Mout) in this case 8 rows with x,y,z in each row of M > #repeated k times with column j numbered from 1:k > # ! can do with nested loops but this is very slow ( example below) > #How do I acheive this quickly without loops? > Mout<-NULL > > for(i in 1:nrow(M)){ > a=M[i,c("x","y","z")] > for (j in 1:M[i,"k"]){ > b=c(a,j) > Mout<-rbind(Mout,b) > } > } > colnames(Mout)[4]<-"j" > print(Mout) > > ######################################################### > > Thanks > > Nevil Amos >[[alternative HTML version deleted]]
nevil amos
2020-Apr-01 03:00 UTC
[R] repeat rows of matrix by number (k) in one colummatrix adding column j with values 1:k
OK sorted - hope these postings might help someone else Any even faster options would be appreciated still #seq() does not work but sequence() does print("rep and sequence") print(system.time({ j<-NULL MOut<-NULL MOut<-M[rep(1:nrow(M), times = M[,4]), ] j<-sequence(M[,4]) MOut<-cbind(MOut,j) colnames(Mout)<-c("x","y","z","j") })) On Wed, 1 Apr 2020 at 13:42, nevil amos <nevil.amos at gmail.com> wrote:> Well, > I found a way to do it partly using rep(), and one loop that makes it 10x > or more faster however would still be good to do without the loop at all > matrix made slightly beigger (10000 rows): > > M<-matrix(c(1:30000 > ), 10000,3) > M<-cbind(M,sample(1:5,size = 10000,replace = T)) > #Print(M) > #Create matrix (Mout) in this case 8 rows with x,y,z in each row of M > #repeated k times with column j numbered from 1:k > # ! can do with nested loops but this is very slow ( example below) > #How do I acheive this quickly without loops? > print("double loop") > print(system.time({ > Mout<-NULL > > for(i in 1:nrow(M)){ > a=M[i,1:3] > k=M[i,4] > for (j in 1:k){ > b=c(a,j) > Mout<-rbind(Mout,b) > } > } > colnames(Mout)<-c("x","y","z","j") > })) > > print("rep and single loop") > print(system.time({ > j<-NULL > MOut<-NULL > MOut<-M[,1:3][rep(1:nrow(M), times = M[,4]), ] > for(i in M[,4])(j<-c(j,1:i)) > MOut<-cbind(MOut,j) > colnames(Mout)<-c("x","y","z","j") > })) > > On Wed, 1 Apr 2020 at 12:18, nevil amos <nevil.amos at gmail.com> wrote: > >> Hi >> >> I can achieve this using two for loops but it is slow I need to do this >> on many matrices with tens of millions of rows of x,y,z and k >> >> What is a faster method to achieve this, I cannot use rep as j changes in >> each row of the new matrix >> ############################################### >> M<-matrix(c(1,2,3,4,1,2,3,4,1,2,3,4, 2, 1, 3, 2 >> ), 4,4, dimnames = list(NULL, c("x", "y", "z","k"))) >> >> Print(M) >> #Create matrix (Mout) in this case 8 rows with x,y,z in each row of M >> #repeated k times with column j numbered from 1:k >> # ! can do with nested loops but this is very slow ( example below) >> #How do I acheive this quickly without loops? >> Mout<-NULL >> >> for(i in 1:nrow(M)){ >> a=M[i,c("x","y","z")] >> for (j in 1:M[i,"k"]){ >> b=c(a,j) >> Mout<-rbind(Mout,b) >> } >> } >> colnames(Mout)[4]<-"j" >> print(Mout) >> >> ######################################################### >> >> Thanks >> >> Nevil Amos >> >[[alternative HTML version deleted]]
Jim Lemon
2020-Apr-01 04:33 UTC
[R] repeat rows of matrix by number (k) in one colummatrix adding column j with values 1:k
Hi Nevil, It's a nasty piece of work, but: M<-matrix(c(1,2,3,4,1,2,3,4,1,2,3,4,2,1,3,2),4,4, dimnames = list(NULL, c("x", "y", "z","k"))) M reprow<-function(x) return(matrix(rep(x,x[length(x)]),nrow=x[length(x)],byrow=TRUE)) toseq<-function(x) return(1:x) j<-unlist(sapply(M[,"k"],toseq)) Mlist<-apply(M,1,reprow) Mlist newM<-Mlist[[1]] for(i in 2:length(Mlist)) newM<-rbind(newM,Mlist[[i]]) newM newM<-cbind(newM,j) colnames(newM)<-c(colnames(M),"j") newM Jim On Wed, Apr 1, 2020 at 1:43 PM nevil amos <nevil.amos at gmail.com> wrote:> > Well, > I found a way to do it partly using rep(), and one loop that makes it 10x > or more faster however would still be good to do without the loop at all > matrix made slightly beigger (10000 rows): > > M<-matrix(c(1:30000 > ), 10000,3) > M<-cbind(M,sample(1:5,size = 10000,replace = T)) > #Print(M) > #Create matrix (Mout) in this case 8 rows with x,y,z in each row of M > #repeated k times with column j numbered from 1:k > # ! can do with nested loops but this is very slow ( example below) > #How do I acheive this quickly without loops? > print("double loop") > print(system.time({ > Mout<-NULL > > for(i in 1:nrow(M)){ > a=M[i,1:3] > k=M[i,4] > for (j in 1:k){ > b=c(a,j) > Mout<-rbind(Mout,b) > } > } > colnames(Mout)<-c("x","y","z","j") > })) > > print("rep and single loop") > print(system.time({ > j<-NULL > MOut<-NULL > MOut<-M[,1:3][rep(1:nrow(M), times = M[,4]), ] > for(i in M[,4])(j<-c(j,1:i)) > MOut<-cbind(MOut,j) > colnames(Mout)<-c("x","y","z","j") > })) > > On Wed, 1 Apr 2020 at 12:18, nevil amos <nevil.amos at gmail.com> wrote: > > > Hi > > > > I can achieve this using two for loops but it is slow I need to do this > > on many matrices with tens of millions of rows of x,y,z and k > > > > What is a faster method to achieve this, I cannot use rep as j changes in > > each row of the new matrix > > ############################################### > > M<-matrix(c(1,2,3,4,1,2,3,4,1,2,3,4, 2, 1, 3, 2 > > ), 4,4, dimnames = list(NULL, c("x", "y", "z","k"))) > > > > Print(M) > > #Create matrix (Mout) in this case 8 rows with x,y,z in each row of M > > #repeated k times with column j numbered from 1:k > > # ! can do with nested loops but this is very slow ( example below) > > #How do I acheive this quickly without loops? > > Mout<-NULL > > > > for(i in 1:nrow(M)){ > > a=M[i,c("x","y","z")] > > for (j in 1:M[i,"k"]){ > > b=c(a,j) > > Mout<-rbind(Mout,b) > > } > > } > > colnames(Mout)[4]<-"j" > > print(Mout) > > > > ######################################################### > > > > Thanks > > > > Nevil Amos > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.