2015-04-23 421 views
1

我正在使用R操纵我的基因组数据,但遇到了一些问题。尽管我可以自己解决问题,但我认为有一种更有效的方法来解决问题。如何将多个矩阵帧合并为一个使用R?

我有三个矩阵,两列表明一个是基因名称,另一个是癌症信息,我想将它们组合成一个数据框。

这里是我的矩阵:

result0 
tp53 c1 
apc c2 

result1 
tp53 d1 
col2a1 d2 

result2 
tp53 e1 
wt1 e2 

和我想要做的是通过如下面图中添加两列三个矩阵合并为一个。

combined result 
tp53 c1 d1 e1 
apc c2 
col2a1 d2 
wt1 e2 

通过重复行组合成单个行并添加两个附加列,我可以合并不同的数据集到含有所有的结果一个新的。 我该如何使用R语言来做到这一点?我需要在有大量行的矩阵上解决这个问题。

+0

阅读_in detail_帮助页'?merge.data.frame' – RockScience

+0

[如何在R(内,外,左,右)中连接数据框?](http://stackoverflow.com/questions/ 1299871 /如何对连接数据帧-在-R-内外 - 左 - 右/) – zx8754

回答

0

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> 

注:

  • 我的天堂不要在任何地方混淆列名,因为你没有在你的问题中指定列名。如有必要,您可以通过致电names()/setNames()/colnames()/dimnames()后设置专栏名称。
  • 有趣的是,虽然merge()接受矩阵输入,但它总是吐出一个data.frame,虽然apply()接受data.frame输入,但它总是吐出一个矩阵。我在第二行代码中添加了最后一次调用as.data.frame(),因为您已经指定了需要data.frame作为输出,但是您可以删除该调用以获取矩阵作为最终结果。