Jeff Newmiller
2018-Jul-03 15:47 UTC
[R] Combine by columns a vector with another vector that is constant across rows
Sorry trying again... fastWolfgang <- function( v, vec ) { matrix( c( v, rep( vec, each = length( v ) ) ) , nrow = length( v ) ) } On July 3, 2018 8:21:47 AM PDT, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote:>Gabor's solution seems to optimize 'simpler'. > >More efficient is to learn that in R a vector is not a matrix, but a >matrix is just an ornamented vector. > >fastWolfgang <- function( v, vec ) { > matrix( c( v, rep( vec, length( v ) ) ) > , now = length( v ) ) >} > >On July 3, 2018 6:28:45 AM PDT, "Viechtbauer, Wolfgang (SP)" ><wolfgang.viechtbauer at maastrichtuniversity.nl> wrote: >>Hi All, >> >>I have one vector that I want to combine with another vector and that >>other vector should be the same for every row in the combined matrix. >>This obviously does not work: >> >>vec <- c(2,4,3) >>cbind(1:5, vec) >> >>This does, but requires me to specify the correct value for 'n' in >>replicate(): >> >>cbind(1:5, t(replicate(5, vec))) >> >>Other ways that do not require this are: >> >>t(sapply(1:5, function(x) c(x, vec))) >>do.call(rbind, lapply(1:5, function(x) c(x, vec))) >>t(mapply(c, 1:5, MoreArgs=list(vec))) >> >>I wonder if there is a simpler / more efficient way of doing this. >> >>Best, >>Wolfgang >> >>______________________________________________ >>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.
Viechtbauer, Wolfgang (SP)
2018-Jul-03 17:12 UTC
[R] Combine by columns a vector with another vector that is constant across rows
Thanks for all of the suggestions. I did some benchmarking: library(microbenchmark) x <- 1:5 vec <- c(2,4,3) fastWolfgang <- function(v, vec) matrix(c(v, rep(vec, each = length(v))), nrow = length(v)) microbenchmark(cbind(x, t(replicate(length(x), vec))), t(sapply(x, function(x) c(x, vec))), do.call(rbind, lapply(x, function(x) c(x, vec))), t(mapply(c, x, MoreArgs=list(vec))), Reduce(cbind, vec, x), Reduce(cbind2, vec, x), fastWolfgang(x, vec), times=10000L) Jeff's approach is fastest, but Gabor's Reduce(cbind, vec, x) is close (and I really like its simplicity); and very similar to the do.call() approach. Interestingly, for larger vectors, such as: x <- 1:50 vec <- sample(1:100, 200, replace=TRUE) the do.call() approach is the fastest. Best, Wolfgang>-----Original Message----- >From: Jeff Newmiller [mailto:jdnewmil at dcn.davis.ca.us] >Sent: Tuesday, 03 July, 2018 17:48 >To: r-help at r-project.org; Viechtbauer, Wolfgang (SP); r-help at r- >project.org >Subject: Re: [R] Combine by columns a vector with another vector that is >constant across rows > >Sorry trying again... > >fastWolfgang <- function( v, vec ) { > matrix( c( v, rep( vec, each = length( v ) ) ) > , nrow = length( v ) ) >} > >On July 3, 2018 8:21:47 AM PDT, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> >wrote: >>Gabor's solution seems to optimize 'simpler'. >> >>More efficient is to learn that in R a vector is not a matrix, but a >>matrix is just an ornamented vector. >> >>fastWolfgang <- function( v, vec ) { >> matrix( c( v, rep( vec, length( v ) ) ) >> , now = length( v ) ) >>} >> >>On July 3, 2018 6:28:45 AM PDT, "Viechtbauer, Wolfgang (SP)" >><wolfgang.viechtbauer at maastrichtuniversity.nl> wrote: >>>Hi All, >>> >>>I have one vector that I want to combine with another vector and that >>>other vector should be the same for every row in the combined matrix. >>>This obviously does not work: >>> >>>vec <- c(2,4,3) >>>cbind(1:5, vec) >>> >>>This does, but requires me to specify the correct value for 'n' in >>>replicate(): >>> >>>cbind(1:5, t(replicate(5, vec))) >>> >>>Other ways that do not require this are: >>> >>>t(sapply(1:5, function(x) c(x, vec))) >>>do.call(rbind, lapply(1:5, function(x) c(x, vec))) >>>t(mapply(c, 1:5, MoreArgs=list(vec))) >>> >>>I wonder if there is a simpler / more efficient way of doing this. >>> >>>Best, >>>Wolfgang
Eric Berger
2018-Jul-04 06:32 UTC
[R] Combine by columns a vector with another vector that is constant across rows
For what it's worth, for larger vectors, and following on from your observation that the do.call() approach is faster, the following provides some modest additional speedup: cbind(x,t(do.call(cbind, lapply(x, function(y) vec)))) Rgds, Eric On Tue, Jul 3, 2018 at 8:12 PM, Viechtbauer, Wolfgang (SP) < wolfgang.viechtbauer at maastrichtuniversity.nl> wrote:> Thanks for all of the suggestions. I did some benchmarking: > > library(microbenchmark) > > x <- 1:5 > vec <- c(2,4,3) > > fastWolfgang <- function(v, vec) > matrix(c(v, rep(vec, each = length(v))), nrow = length(v)) > > microbenchmark(cbind(x, t(replicate(length(x), vec))), > t(sapply(x, function(x) c(x, vec))), > do.call(rbind, lapply(x, function(x) c(x, vec))), > t(mapply(c, x, MoreArgs=list(vec))), > Reduce(cbind, vec, x), > Reduce(cbind2, vec, x), > fastWolfgang(x, vec), times=10000L) > > Jeff's approach is fastest, but Gabor's Reduce(cbind, vec, x) is close > (and I really like its simplicity); and very similar to the do.call() > approach. > > Interestingly, for larger vectors, such as: > > x <- 1:50 > vec <- sample(1:100, 200, replace=TRUE) > > the do.call() approach is the fastest. > > Best, > Wolfgang > > >-----Original Message----- > >From: Jeff Newmiller [mailto:jdnewmil at dcn.davis.ca.us] > >Sent: Tuesday, 03 July, 2018 17:48 > >To: r-help at r-project.org; Viechtbauer, Wolfgang (SP); r-help at r- > >project.org > >Subject: Re: [R] Combine by columns a vector with another vector that is > >constant across rows > > > >Sorry trying again... > > > >fastWolfgang <- function( v, vec ) { > > matrix( c( v, rep( vec, each = length( v ) ) ) > > , nrow = length( v ) ) > >} > > > >On July 3, 2018 8:21:47 AM PDT, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> > >wrote: > >>Gabor's solution seems to optimize 'simpler'. > >> > >>More efficient is to learn that in R a vector is not a matrix, but a > >>matrix is just an ornamented vector. > >> > >>fastWolfgang <- function( v, vec ) { > >> matrix( c( v, rep( vec, length( v ) ) ) > >> , now = length( v ) ) > >>} > >> > >>On July 3, 2018 6:28:45 AM PDT, "Viechtbauer, Wolfgang (SP)" > >><wolfgang.viechtbauer at maastrichtuniversity.nl> wrote: > >>>Hi All, > >>> > >>>I have one vector that I want to combine with another vector and that > >>>other vector should be the same for every row in the combined matrix. > >>>This obviously does not work: > >>> > >>>vec <- c(2,4,3) > >>>cbind(1:5, vec) > >>> > >>>This does, but requires me to specify the correct value for 'n' in > >>>replicate(): > >>> > >>>cbind(1:5, t(replicate(5, vec))) > >>> > >>>Other ways that do not require this are: > >>> > >>>t(sapply(1:5, function(x) c(x, vec))) > >>>do.call(rbind, lapply(1:5, function(x) c(x, vec))) > >>>t(mapply(c, 1:5, MoreArgs=list(vec))) > >>> > >>>I wonder if there is a simpler / more efficient way of doing this. > >>> > >>>Best, > >>>Wolfgang > ______________________________________________ > 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. >[[alternative HTML version deleted]]