[R] Combine by columns a vector with another vector that is constant across rows

Viechtbauer, Wolfgang (SP) wo||g@ng@v|echtb@uer @end|ng |rom m@@@tr|chtun|ver@|ty@n|
Tue Jul 3 19:12:58 CEST 2018


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 using dcn.davis.ca.us]
>Sent: Tuesday, 03 July, 2018 17:48
>To: r-help using r-project.org; Viechtbauer, Wolfgang (SP); r-help using 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 using 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 using 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


More information about the R-help mailing list