Florian Bw Florian Bw - 1 year ago 82
R Question

R: merging matrices (not data.frames)

merge is a very nice function: It merges matrices and data.frames, and returns a data.frame.

Having rather big character matrices,
is there another good way to merge -
without data.frame conversion?

Comment 1:
A small function to merge a named vector with a matrix or data.frame. Elements of the vector can link to multiple entries in the matrix:

expand <- function(v,m,by.m,v.name='v',...) {
df <- do.call(rbind,lapply(names(v),function(x) {
pos <- which(m[,by.m] %in% v[x])
colnames(df)[1] <- v.name


v <- rep(letters,each=3)[seq_along(letters)]
names(v) <- letters
m <- data.frame(a=unique(v),b=seq_along(unique(v)),stringsAsFactors=F)

Answer Source

You can use a combination of match and cbind to do the equivalent of merge without conversion to data frame, a simple example:

st1 <- state.x77[ sample(1:50), ]
st2 <- as.matrix( USArrests )[ sample(1:50), ]

tmp1 <- match(rownames(st1), rownames(st2) )

st3 <- cbind( st1, st2[tmp1,] )

Keeping track of which columns you want, and merging whith many to 1 relationships or missing rows in one group require a bit more thought but are still possible.