如何使用R将多个矩阵帧组合成一个?

时间:2015-04-23 09:59:02

标签: r matrix merge

我正在使用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语言来做?我需要在有大量行的矩阵上解决这个问题。

1 个答案:

答案 0 :(得分: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值仍然分成单独的(非左侧) )合并对象中的列。您可以使用另一行代码解决此问题(或者您可以将两行合并为一行,因为m仅在第二行代码的RHS上使用一次):

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作为输出,但您可以删除该调用以获取矩阵作为最终结果。< / LI>