繁体   English   中英

如何使用R将多个矩阵帧合并为一个?

[英]How to combine multiple matrix frames into one using 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语言做到这一点? 我需要在具有大量行的矩阵上解决此问题。

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()非关键列不是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() / 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作为输出,但是您可以删除该调用以获取矩阵作为最终结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM