[R] Merging matrices of different rows

Ben Bolker bbo|ker @end|ng |rom gm@||@com
Thu Jun 26 15:01:59 CEST 2025


   There's always

cbind.fill <- function(...) {
    L <- list(...)
    tmats <- lapply(L, \(x) as.data.frame(t(x)))
    t(do.call(plyr::rbind.fill, tmats))
}

* rbind.fill is in plyr, not dplyr
* apparently rbind.fill needs data frames as input
* this function isn't very efficient, but might be good enough

On 2025-06-26 8:52 a.m., Steven Yen wrote:
> Thanks. I will program my own cbind.fill.
> 
> Steven from iPhone
> 
>> On Jun 26, 2025, at 7:11 PM, Rui Barradas <ruipbarradas using sapo.pt> wrote:
>>
>> Às 11:46 de 26/06/2025, Steven Yen escreveu:
>>> I'd like to cbind matrices of different number of rows, with missing values filled by "NA". I used dplyr. The following is obviously not working. Help appreciated.
>>>> library(dplyr)
>>>> a<-matrix(1:12,nrow=6); a
>>>       [,1] [,2]
>>> [1,]    1    7
>>> [2,]    2    8
>>> [3,]    3    9
>>> [4,]    4   10
>>> [5,]    5   11
>>> [6,]    6   12
>>>> b<-matrix(5:12,nrow=4); b
>>>       [,1] [,2]
>>> [1,]    5    9
>>> [2,]    6   10
>>> [3,]    7   11
>>> [4,]    8   12
>>>> cbind.fill(a,b)
>>> Error in cbind.fill(a, b) : could not find function "cbind.fill"
>>> Steven from iPhone
>>>     [[alternative HTML version deleted]]
>>> ______________________________________________
>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>> Hello,
>>
>> The error message says that though you have dplyr loaded, R cannot find cbind.ill. This means that that function is not a dplyr function.
>> A google search found rowr::cbind.fill but package rowr is not available for R 4.5.0. Abandonware?
>>
>> Program your own cbind.fill.
>>
>>
>>
>> cbind.fill <- function(...) {
>>   dots <- list(...)
>>   i <- sapply(dots, \(x) inherits(x, "matrix"))
>>   dots <- dots[i]
>>   mx <- max(sapply(dots, nrow))
>>   out_list <- lapply(dots, \(x) {
>>     if(nrow(x) < mx)
>>       x <- rbind(x, matrix(nrow = mx - nrow(x), ncol = ncol(x)))
>>     x
>>   })
>>   do.call(cbind, out_list)
>> }
>>
>> a<-matrix(1:12,nrow=6)
>> b<-matrix(5:12,nrow=4)
>>
>> cbind.fill(a, b)
>> #>      [,1] [,2] [,3] [,4]
>> #> [1,]    1    7    5    9
>> #> [2,]    2    8    6   10
>> #> [3,]    3    9    7   11
>> #> [4,]    4   10    8   12
>> #> [5,]    5   11   NA   NA
>> #> [6,]    6   12   NA   NA
>> cbind.fill(b, a, b)
>> #>      [,1] [,2] [,3] [,4] [,5] [,6]
>> #> [1,]    5    9    1    7    5    9
>> #> [2,]    6   10    2    8    6   10
>> #> [3,]    7   11    3    9    7   11
>> #> [4,]    8   12    4   10    8   12
>> #> [5,]   NA   NA    5   11   NA   NA
>> #> [6,]   NA   NA    6   12   NA   NA
>> cbind.fill(b, a, b, a[1:5, ])
>> #>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
>> #> [1,]    5    9    1    7    5    9    1    7
>> #> [2,]    6   10    2    8    6   10    2    8
>> #> [3,]    7   11    3    9    7   11    3    9
>> #> [4,]    8   12    4   10    8   12    4   10
>> #> [5,]   NA   NA    5   11   NA   NA    5   11
>> #> [6,]   NA   NA    6   12   NA   NA   NA   NA
>>
>>
>>
>> (Then I found [1], with a version of cbind.fill equivalent to mine.)
>>
>> [1] https://stackoverflow.com/a/7962286/8245406
>>
>>
>> Hope this helps,
>>
>> Rui Barradas
>>
>>
>>
>> --
>> Este e-mail foi analisado pelo software antivírus AVG para verificar a presença de vírus.
>> www.avg.com
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

-- 
Dr. Benjamin Bolker
Professor, Mathematics & Statistics and Biology, McMaster University
Director, School of Computational Science and Engineering
 > E-mail is sent at my convenience; I don't expect replies outside of 
working hours.



More information about the R-help mailing list