我有一个细菌清单,每个细菌都有自己丰富的数据框。我也有相同的细菌列表,但在同一数据框中的顺序不同。
我想将丰度与第二个列表相匹配,但我不知道如何去做。
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栏中的数据相匹配,我希望丰度也与“提示”栏中的细菌相匹配。
例如,Acaricomes phytoseiuli的丰度为0.000382414,因此在D列0.000382414中将印有Acaricomes phytoseiuli所在的位置。同样,Taxon和Tips包含完全相同的数据,只是顺序不同。
我希望这是有道理的。
如果在R或Excel中完成此操作无关紧要,谢谢。
答案 0 :(得分:2)
在D栏的excel中,您可以执行以下操作:
=VLOOKUP(C3;A3:B13;2;FALSE)
C3 是提示, A3:B13 是搜索此范围的 A 细菌名称和 B 丰度,如果找到,将返回相应的匹配丰度。
如果您收到#N/A
之类的错误而不是匹配。您还可以使用以下公式来避免这些错误:
=IFNA(VLOOKUP(C3;$A$3:B13;2;FALSE);"No match")
修改:调整文件的范围!
编辑2 :请注意我使用的分隔符为;
,您的Excel可能会使用逗号,
分隔符
答案 1 :(得分:1)
正如其他人所提到的,如果没有匹配的数据,很难进行测试,但这样的事情应该有效,使用match
匹配值。
df$D <- df$Total_abundance[ match( df$Tips, df$Taxon ) ]
答案 2 :(得分:1)
我认为你的细菌清单是独一无二的 作为样本数据框:
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 :(得分:0)
首先,如果您的Taxon和Tips列包含完全相同的数据,只是按照不同的顺序,它们在同一数据框中没有位置。您应该有两个数据框,或者提出某种键来定义系统发生树中Taxon项的位置,然后根据需要按字母顺序或通过系统发育对数据框进行重新排序。 作为一个快速解决方案,我首先在一个单独的数据框中提取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)