[R] Merging matrices of different rows

Steven Yen @tyen @end|ng |rom ntu@edu@tw
Thu Jun 26 14:52:26 CEST 2025


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]]



More information about the R-help mailing list