在 R 或 Excel 中匹配和排序数据

Matching and sorting data in R or Excel

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

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

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
...

因此,丰度与 Taxon 列中的数据相匹配,我希望丰度也与 "Tips" 列中的细菌相匹配。

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

我希望这是有道理的。

用 R 还是 Excel 都没有关系,谢谢。

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

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

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

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]
}

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

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

C3 将是 TIPA3:B13 它搜索的范围这,A 细菌名称 B 丰度 如果找到,将 return 匹配的相应丰度。

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

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

编辑:根据您的文件调整范围!

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

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

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)