【问题标题】:paste concatenated strings if rownames match如果行名匹配,则粘贴连接的字符串
【发布时间】:2016-10-20 16:24:07
【问题描述】:

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

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 中匹配的行名替换为 2 中相应的合并行。

例如如果在d2发现FJ889562.1.1501,则在d1替换为“Bacteria, Proteobacteria, Alphaproteobacteria, Rhizobiales, Rhodobiaceae, Parvibaculum, uncultured bacterium”。

这太混乱了吗?

感谢您的帮助。

【问题讨论】:

  • 如果您使用dput() 会有所帮助,以便我们可以使用您的数据测试一些解决方案。澄清一下,您希望 d1 中的第一个 行名称 显示为“Bacteria, Proteobacteria, Alphaproteobacteria, Rhizobiales, Rhodobiaceae, Parvibaculum, uncultured bacterium”?
  • 请问您为什么要这样做?完全按照您的意愿行事会导致数据混乱,难以分析...

标签: r dataframe gsub


【解决方案1】:

免责声明:我不是在回答您的琐碎问题,而是告诉您应该做些什么来合并您的数据并能够在以后对其进行有趣的分析。将级联分类法作为行名没有什么意义,通常是一个 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”等。

【讨论】:

    【解决方案2】:

    您可以通过合并来做到这一点,详情请参阅?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=", ") 执行此操作,但可能没有必要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 2022-10-15
      • 2021-04-17
      相关资源
      最近更新 更多