merge()
函数只需要两个参数进行合并。既然你有三个矩阵,你必须调用Reduce()
到累计合并:
m1 <- matrix(c('tp53','apc','c1','c2'),2);
m2 <- matrix(c('tp53','col2a1','d1','d2'),2);
m3 <- matrix(c('tp53','wt1','e1','e2'),2);
m <- Reduce(function(x,y) merge(x,y,1,all=T),list(m1,m2,m3));
m;
## V1 V2.x V2.y V2
## 1 apc c2 <NA> <NA>
## 2 tp53 c1 d1 e1
## 3 col2a1 <NA> d2 <NA>
## 4 wt1 <NA> <NA> e2
这不是merge()
设计,以非键列组合在一起,因此,你可以看到,C1/C2/D1 /在合并的对象中,d2/e1/e2值仍然分为单独的(非最左边的)列。你可以用另一行代码解决这个问题(或者你可以在RHS两行合并为一个,由于使用m
只有一次的代码本次行):
m <- as.data.frame(t(apply(m,1,function(x) na.omit(x)[1:length(x)])));
m;
## V1 V2 V3 V4
## 1 apc c2 <NA> <NA>
## 2 tp53 c1 d1 e1
## 3 col2a1 d2 <NA> <NA>
## 4 wt1 e2 <NA> <NA>
您可能注意到,该行m
的顺序不遵循输入矩阵中出现键值的顺序。我不确定这是为什么发生的;看起来merge()
可以在匹配的行之前放置不匹配的行(例如apc
)(例如tp53
)。保证的行订单不是merge()
合同的一部分。在任何情况下,你可以用下面的解决这个问题(行的名称就可以搞掂之后为好,如果有必要,通过row.names()
/rownames()
/dimnames()
):
m[match(m[,1],unique(c(m1[,1],m2[,1],m3[,1]))),];
## V1 V2 V3 V4
## 2 tp53 c1 d1 e1
## 1 apc c2 <NA> <NA>
## 3 col2a1 d2 <NA> <NA>
## 4 wt1 e2 <NA> <NA>
注:
阅读_in detail_帮助页'?merge.data.frame' – RockScience
[如何在R(内,外,左,右)中连接数据框?](http://stackoverflow.com/questions/ 1299871 /如何对连接数据帧-在-R-内外 - 左 - 右/) – zx8754