我正在使用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 :(得分: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>