如果rownames匹配,则粘贴连接字符串

时间:2016-10-20 16:24:07

标签: r dataframe gsub

我有两个数据框,部分看起来像这样:

D1

                SRR1686681 SRR1686679 SRR1686680 SRR1686686 ERR1014349 ERR1014347 
FJ889562.1.1501          0          0          0          0          0          0
JQ236848.1.1432          1          0          1          0          0          0
EU431805.1.1493          0          0          0          0          0          0
EU537467.1.1392          1          0          0          0         10          0
JF500179.1.1495          0          0          0          0          0          0
HM128723.1.1454          0          0          0          0          0          0

和d2

                taxonomy               X                  X.1               X.2                X.3              X.4                               X.5
FJ889562.1.1501 Bacteria  Proteobacteria  Alphaproteobacteria       Rhizobiales       Rhodobiaceae     Parvibaculum              uncultured bacterium
JQ236848.1.1432 Bacteria  Proteobacteria   Betaproteobacteria   Burkholderiales     Comamonadaceae       Variovorax              uncultured bacterium
EU431805.1.1493 Bacteria  Proteobacteria  Alphaproteobacteria       Rhizobiales       Rhizobiaceae        Rhizobium        Agrobacterium sp. BKBLPu14
EU537467.1.1392 Bacteria  Proteobacteria   Betaproteobacteria     Rhodocyclales     Rhodocyclaceae         Azoarcus                  bacterium SL4.29
JF500179.1.1495 Bacteria  Proteobacteria  Alphaproteobacteria  Sphingomonadales  Sphingomonadaceae  Novosphingobium  uncultured alpha proteobacterium
HM128723.1.1454 Bacteria  Proteobacteria   Betaproteobacteria   Burkholderiales     Comamonadaceae       Variovorax              Variovorax sp. SOD31

我想将d1中匹配的rownames替换为2中相应的合并行。

e.g。如果在d2中发现FJ889562.1.1501,那么它应该被"细菌,变形菌,Alphaproteobacteria,Rhizobiales,Rhodobiaceae,Parvibaculum,未培养的细菌"在d1。

这太混乱了吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

免责声明:我没有回答您的问题,但是告诉您应该如何合并数据并在以后对其进行有趣的分析。将连续分类法作为行名称使用起来很有意义,通常是XY问题!

停止使用行名来存储有用的信息。在data.frame中,数据应存储在列中。

首先,将您的行名称转换为实际列。这里的行名称似乎是唯一的ID:

d1$uid <- row.names(d1)
d2$uid <- row.names(d2)

现在,在我看来,您的最终目标是将所有信息都放在一个data.frame中。所以你想要做的就是加入data.frames。有很多方法可以做到这一点,我个人喜欢包dplyr的语法。基本R函数为merge

library("dplyr")
fused_d <- left_join(d1, d2, by="uid")

这会将所有行保留在d1中,但在匹配的uid时从d2传输信息。要将所有行保留在d1或d2中,请改用full_join

旁注:您的数据看起来没有正确加载。 首先,你应该避免加载任何行名称。

其次,d2的列名不正确。你为什么不给构成分类法的所有信息都说出正确的名字?你似乎想要连接它,但它更加有用,例如想象你想要过滤“Alphaproteobacteria”等。

答案 1 :(得分:0)

您可以使用合并执行此操作,有关详细信息,请参阅?merge

> merge(d1, d2, by="row.names")

        Row.names SRR1686681 SRR1686679 SRR1686680 SRR1686686 ERR1014349 ERR1014347
1 EU431805.1.1493          0          0          0          0          0          0
2 EU537467.1.1392          1          0          0          0         10          0
3 FJ889562.1.1501          0          0          0          0          0          0
4 HM128723.1.1454          0          0          0          0          0          0
5 JF500179.1.1495          0          0          0          0          0          0
6 JQ236848.1.1432          1          0          1          0          0          0
  taxonomy              X                 X.1              X.2               X.3
1 Bacteria Proteobacteria Alphaproteobacteria      Rhizobiales      Rhizobiaceae
2 Bacteria Proteobacteria  Betaproteobacteria    Rhodocyclales    Rhodocyclaceae
3 Bacteria Proteobacteria Alphaproteobacteria      Rhizobiales      Rhodobiaceae
4 Bacteria Proteobacteria  Betaproteobacteria  Burkholderiales    Comamonadaceae
5 Bacteria Proteobacteria Alphaproteobacteria Sphingomonadales Sphingomonadaceae
6 Bacteria Proteobacteria  Betaproteobacteria  Burkholderiales    Comamonadaceae
              X.4                              X.5
1       Rhizobium       Agrobacterium_sp._BKBLPu14
2        Azoarcus                 bacterium_SL4.29
3    Parvibaculum             uncultured_bacterium
4      Variovorax             Variovorax_sp._SOD31
5 Novosphingobium uncultured_alpha_proteobacterium
6      Variovorax             uncultured_bacterium

如果您仍想更改row.names以使用分类信息,可以使用paste(..., collapse=", ")从那里开始,但可能没有必要。