# Re: [R] merging

From: Sundar Dorai-Raj <sundar.dorai-raj_at_pdf.com>
Date: Wed 31 May 2006 - 06:09:27 EST

Gavin Simpson wrote:
> Dear List,
>
> Given,
>
> y <- matrix(c(0,1,1,1,0,0,0,4,4), ncol = 3, byrow = TRUE)
> rownames(y) <- c("a","b","c")
> colnames(y) <- c("1","2","3")
> y
> y2 <- y[2:3, ]
> rownames(y2) <- c("x","z")
> y2
>
> how can I stop
>
> merge(y, y2, all = TRUE, sort = FALSE)
>
> squishing the extra rows? Ideally I want the same as:
>
> rbind(y, y2)
>
> in this case. This is specific example of situation where two data
> matrices have same column variables and all I want is to stick the two
> sets of rows together, but I have been using merge for cases such as the
> one below, where the second matrix has extra column(s):
>
> y3 <- matrix(c(0,1,1,1,0,0,0,4,4,5,6,7), ncol = 4, byrow = TRUE)
> rownames(y3) <- c("d","e","f")
> colnames(y3) <- c("1","2","3","4")
> y3
> merge(y, y3, all = TRUE, sort = FALSE)
>
> We don't know before hand if the columns will match. But I see now that
> even this doesn't work as I was expecting/thinking!
>
> So I'm looking for a general way to merge two matrices such that the
> number of rows in the merged matrix is nrow(mat1) + nrow(mat2) and the
> number of columns in the merged matrix is length(unique(colnames(mat1),
> colnames(mat2).
>
> Is there a function in R to do this, or can someone suggest a way to
> achieve this? My R version info is at the end.
>
> Just to be clear, for the y, y3 example I want something like this
> returned:
>
> 1 2 3 4
> a 0 1 1 NA
> b 1 0 0 NA
> c 0 4 4 NA
> d 0 1 1 1
> e 0 0 0 4
> f 4 5 6 7
>
> and for the y, y2 example, I want something like this returned:
>
> 1 2 3
> a 0 1 1
> b 1 0 0
> c 0 4 4
> x 1 0 0
> z 0 4 4
>
> Many thanks,
>
> Gav
>
>

```>>version

>
>                _
> platform       i686-pc-linux-gnu

> arch           i686
> os             linux-gnu
> system         i686, linux-gnu
> status         Patched
> major          2
> minor          3.0
> year           2006
> month          05
> day            03
> svn rev        37978
> language       R
```
> version.string Version 2.3.0 Patched (2006-05-03 r37978)

rbind.all <- function(...) {

x <- list(...)
cn <- unique(unlist(lapply(x, colnames)))    for(i in seq(along = x)) {

```     if(any(m <- !cn %in% colnames(x[[i]]))) {
na <- matrix(NA, nrow(x[[i]]), sum(m))
dimnames(na) <- list(rownames(x[[i]]), cn[m])
x[[i]] <- cbind(x[[i]], na)
}
```

}
do.call(rbind, x)
}

y <- matrix(c(0,1,1,1,0,0,0,4,4), ncol = 3, byrow = TRUE) rownames(y) <- c("a","b","c")
colnames(y) <- c("1","2","3")
y2 <- y[2:3, 2:3]
rownames(y2) <- c("x","z")
y3 <- matrix(c(0,1,1,1,0,0,0,4,4,5,6,7), ncol = 4, byrow = TRUE)
rownames(y3) <- c("d","e","f")
colnames(y3) <- c("1","2","3","4")

rbind.all(y, y2, as.data.frame(y3))

It does very little error-checking, so be careful how you use it.

--sundar

R-help@stat.math.ethz.ch mailing list