【发布时间】:2019-02-26 20:34:01
【问题描述】:
我面临一个问题,即一个包检索长度不同的分类信息(关于物种)。因此,该函数将输出存储在一个列表中,该列表的元素包含 2 行和各种列数的表格(1 行用于分类等级,1 行用于信息本身):
taxo.spA <- data.frame(name=c("Animalia", "Arthropoda", "Chelicerata",
"Arachnida", "Acari"),
rank=c("Kingdom", "Phylum", "Subphylum", "Class",
"Subclass"))
taxo.spB <- data.frame(name=c("Animalia", "Chordata", "Vertebrata",
"Gnathostomata", "Actinopterygii", "Perciformes",
"Trachinoidei", "Ammodytidae", "Ammodytes",
"Ammodytes tobianus"),
rank=c("Kingdom", "Phylum", "Subphylum", "Superclass",
"Class", "Order", "Suborder", "Family", "Genus",
"Species"))
我想最终得到一个以列为列、以行为名称的表。 主要问题是分类法通常在等级方面有所不同,有些分类群没有解决到物种级别(比如这个 Acari),或者如果解决了,等级可能会不同(没有超类)所以你不能 cbind 或rbind 那些表(=不同的列数或行数)。
但是,分类等级遵循等级制度,因此我一直在尝试重建这一系列等级(从王国到物种或亚种)。 我想知道最好的方法是什么?是否有一个包/函数可以在两个字符串之间找到匹配项以及插入缺失内容的位置?
例如:
ranks1 <- c("Kingdom", "Phylum", "Subphylum", "Class")
ranks2 <- c("Kingdom", "Phylum", "Subphylum", "Superclass", "Class", "Order")
该函数将确定 Kingdom:Subphylum 和 Class 是共同的。而且 Subphylum 和 Class 围绕着 Superclass,因此 Superclass 可以插入 Subphylum 和 Class 之间。最后,Order 丢失了,应该在 Class 之后的右侧:
“王国”、“门”、“亚门”、“超类”、“类”、“秩序”
最终,我正在编写的函数将构建一个包含 n 列(=最长的分类)和 S 行(分类单元的数量)的 data.frame,并用我在每个分类单元上拥有的分类信息以正确的方式填充它列,其余为 NA。
desired.output <- data.frame(rbind(c("Animalia", "Arthropoda", "Chelicerata",
NA, "Arachnida", "Acari", NA),
c("Animalia", "Chordata", "Vertebrata",
"Gnathostomata", "Actinopterygii", NA,
"Perciformes")))
names(desired.output) <- c("Kingdom", "Phylum", "Subphylum", "Superclass",
"Class", "Subclass", "Order")
我试图从我拥有的最完整的信息之一开始,并填补与其他分类群相比的空白。我玩过 setdiff(), intersect(), %in%;并试图找到共同点,什么只属于两个字符串之一并重建它,但我不确定这是最好的方法吗?
有什么想法吗?有什么建议吗?
注意我会将数据集保留为数据框(尽管现在更多的是矩阵),因为稍后我会将其与其他数据集合并。
编辑/回答如下
首先,感谢您的帮助。我从答案中启发了自己,并设法让它发挥作用。
主要问题是列表中包含的表 (1) 的行数不同,(2) 行可能包含不同的信息(分类中可能会跳过某些等级),因此很难合并所有内容在一张桌子内。
但是,分类具有这种树状层次结构,我可以使用它来查找这些等级如何分支在一起。 我是如何解决这个问题的:
我使用具有最多解析信息的有机体作为我的参考(= 最高等级数),然后获取每个等级列表(等级向量)并找到与这个最解析向量的差异。 然后我通过查看层次结构中的高于和低于它们的等级以及它们在我的参考中匹配的位置来搜索这些缺失等级的位置。
四种情况是可能的(注意最高等级在左边,最低在右边):
- 不匹配:我无法将该排名放在分类中(目前)
- 2 个匹配项:我可以将两个匹配项之间缺少的信息放在我的 参考
- 左侧有 1 个匹配项:我可以在匹配项之后放置它
- 右侧有 1 个匹配项:我可以将其放在匹配项之前
我遍历缺失的排名并按顺序增加排名,直到数据集中所有可能的排名都包含在向量中:我使用函数 append() 在由常见排名位置定义的特定位置之后依次添加缺失的排名在参考和其他分类法之间。
最后,我将此向量用作最终表格的列名,并用分类信息填充表格(见下文)。 也许不是最好的,但应该在各个分类法中保持一致。
非常感谢! (P.S. 当它终于做它应该做的事时感觉很好)
【问题讨论】:
-
为了更正我的帖子,我得到的列表实际上包含 tibbles 而不是 data.frames(我对这类表不太熟悉)。
标签: r