2010-09-15 150 views
3

合并是一个非常好的功能:它合并矩阵和data.frames,并返回一个data.frame。R:合并矩阵(不是数据帧)

有相当大的字符矩阵, 有合并其他好办法 - 没有data.frame转换?


注释1: 小函数合并与基质或data.frame命名矢量。向量的元素可以链接到多个条目中的矩阵:

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]) 
    cbind(x,m[pos,],...) 
    })) 
    colnames(df)[1] <- v.name 
    df 
} 

实施例:

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

你不需要'cbind'和'rbind'吗? – mbq 2010-09-15 14:08:12

+1

不,它们是不够的:当有一个m:n的关系时,它们不会正确地展开/合并 – 2010-09-17 11:51:45

回答

8

您可以使用匹配和cbind的组合来执行合并的等效无需转换到数据帧时,一个简单的例子:

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

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

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

保持跟踪你想要的列,并且合并多个到1个关系或在一个组中丢失的行需要更多的思考,但仍然有可能。

+0

是的,AFAIK这可能是实现矩阵合并最直接的方法,并且您可能可以创建一个函数,将公共列合并为一个可以应用match()的密钥字符串,如果有多个要合并的列。 – hatmatrix 2010-09-16 03:52:31

+0

match()和%in%是要走的路。谢谢。 – 2010-09-16 19:34:02

+1

您也可以直接通过row.names进行合并。 'merge(x,y,by =“row.names”)'。更多信息[这里](http://stackoverflow.com/questions/5738773/r-how-to-merge-two-matrix-according-to-their-column-and-row-names) – DJJ 2015-12-12 10:55:46

3

否,不是没有或者(a)覆盖合并函数或(b)在创建新merge.matrix() S3功能(这将是解决问题的正确方法)。

可以在merge帮助,请参阅:

价值

的数据帧。

此外,merge.default功能:

> merge.default 
function (x, y, ...) 
merge(as.data.frame(x), as.data.frame(y), ...) 
+0

是的,我喜欢将方法添加到通用'merge()'函数的想法。 – hatmatrix 2010-09-16 03:50:45

2

Matrix.utils包中现在有merge.Matrix函数。这适用于矩阵组合以及大写M矩阵,数据框架等。

匹配解决方案很好,但有人指出在m:n关系上不起作用。它也没有实现merge的其他功能,包括all.xall.y