【问题标题】:Matching and sorting data in R or Excel在 R 或 Excel 中匹配和排序数据
【发布时间】:2018-07-31 23:58:19
【问题描述】:

我有一个细菌列表,每个细菌在数据框中都有自己的丰度。我也有相同的细菌列表,但在同一数据框中以不同的顺序排列。

我想将丰度与第二个列表相匹配,但我不知道如何去做。

dyplyr 包含多种数据排序方法,但我不知道如何匹配丰度并将其打印到新列中,因此它现在与第二个细菌列表匹配。

这是我的数据集的开头:

Taxon                              Total_abundance            Tips  
Acaricomes phytoseiuli             0.000382414        Methanothermobacter thermautotrophicus
Acetivibrio cellulolyticus         0.013979274        Methanobacterium beijingense
Acetobacter aceti                  0.181150551        Methanobacterium bryantii
Acetobacter estunensis             0.023074895        Methanosarcina mazei
Acetobacter tropicalis             0.014615221        Persephonella marina
Achromobacter piechaudii           0.031811039        Sulfurihydrogenibium azorense
Achromobacter xylosoxidans         0.041558442        Balnearium lithotrophicum
Acidicapsa borealis                0.035525932        Isosphaera pallida
Acidimicrobium ferrooxidans        0.013841209        Simkania negevensis
Acidiphilium angustum              0.041702984        Parachlamydia acanthamoebae
Acidiphilium cryptum               0.039265944        Leptospira biflexa
Acidiphilium rubrum                0.041702984        Leptospira fainei
...

所以,丰度与分类列中的数据相匹配,我希望丰度也与“提示”列中的细菌相匹配。

例如,Acaricomes phytoseiuli 的丰度为 0.000382414,因此在 D 列中,0.000382414 将打印在 Acaricomes phytoseiuli 所在位置的旁边。同样,Taxon 和 Tips 包含完全相同的数据,只是顺序不同。

我希望这是有道理的。

在 R 或 Excel 中完成都没有关系,谢谢。

【问题讨论】:

  • 细菌名称在哪里重复?
  • 请提供一个实际包含匹配项的数据示例。
  • @PLATANIUM 这个列表有 1000 多条,这只是顶部,Taxon 列按字母顺序排列,丰度与此匹配,Tips 列按系统发育树的顺序排列,我也需要匹配这里的丰度。除了它们的顺序之外,分类单元和提示是相同的

标签: r excel sorting matching


【解决方案1】:

正如其他人所提到的,如果没有一些匹配的数据,很难进行测试,但这样的事情应该可以工作,使用 match 来匹配值。

df$D <- df$Total_abundance[ match( df$Tips, df$Taxon ) ]

【讨论】:

    【解决方案2】:

    我假设您的细菌列表是独一无二的 作为示例数据框:

    dff <- data.frame(bacteria1=letters[1:10], abundance1=runif(10,0,1),
                      bacteri2=sample(letters[1:10],10), abundance2=0)
    

    现在我们将找到细菌行并插入丰度:

    for(i in 1:nrow(dff)){
      s <- which(dff$bacteri2[i]==dff$bacteria1)
      dff$abundance2[i] <- dff$abundance1[s]
    }
    

    【讨论】:

      【解决方案3】:

      在 D 列下的 excel 中,您可以执行以下操作:

      =VLOOKUP(C3;A3:B13;2;FALSE)
      

      C3 将是 TIP 和 A3:B13 搜索范围,A 是细菌名称和B 丰度,如果找到将返回匹配的相应丰度。

      如果您收到#N/A 之类的错误,则表示不匹配。您还可以使用以下公式来避免这些错误:

      =IFNA(VLOOKUP(C3;$A$3:B13;2;FALSE);"No match")
      

      编辑:调整文件的范围!

      编辑 2:请记住,我使用的分隔符是 ;,而您的 Excel 可能会使用逗号 , 分隔符

      【讨论】:

        【解决方案4】:

        首先,如果您的 Taxon 和 Tips 列包含完全相同的数据,只是顺序不同,那么它们在同一个数据框中没有任何位置。您应该有两个数据框,或者想出某种键来定义分类单元在系统发育树中的位置,然后根据需要重新排序数据框,按字母顺序或系统发育。 作为一个快速的解决方案,我将首先在单独的数据框中提取 Tips 列,通过 Tips 和 Taxon 列将其与原始数据框连接,从而在新数据框中获得正确的丰度值顺序,并且(如果您仍然坚持)使用 cbind 将新重新排序的丰度列粘回到原始数据框中。像这样,假设您使用的是 dplyr(df 是您的数据集的虚拟替代品):

        df <- data.frame(Taxon=c("a","b","c","d","e"), Abundance=c(1:5), Tips=c("b","a","d","c","e"))
        new_df <- select(df, Tips)
        new_df <- left_join(new_df, df, by=c("Tips"= "Taxon"))
        df <- cbind(df, New_Abund=new_df$Abundance)
        rm(new_df)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-21
          • 1970-01-01
          • 1970-01-01
          • 2015-08-06
          • 2013-01-25
          • 1970-01-01
          • 2019-12-24
          相关资源
          最近更新 更多