拆分学名

Splitting scientific names

一个学名通常由3个信息组成:属、种名和作者。一个简单的例子如下:

板栗叶 L.

简单。然而,当我们不得不处理混合体、subspecies/varieties/forma、多位作者和其他不一致时,事情就变得更加复杂了。在这些情况下,物种名称可能如下所示:

比照。 穿心莲 (Burm.f.) 墙。前任

或者这个:

Ipomoea pes-caprae (L.) DC。亚种巴西人 (L.) Ooststr.f


我正试图找到一种可靠的方法来解构这些名称。我可以使用 tons if if/else 语句编写一些 hackish 代码,但我正在寻找更优雅(和健壮)的东西。我在考虑某种解析器,它解析名称的方式类似于解析数学表达式的计算器。不幸的是,我不是最老练的程序员,我之前也没有写过真正的解析器,我也不知道在这种情况下它是否有意义,因为科学名称有很多变化。您认为解决这个问题的最佳方法是什么?首选语言是 R,如果它更适合任务,也可能是 Julia。

你很幸运(有点)。 GBIF 有一个 name parsertaxize 包通过 gbif_parse 函数挂钩到它的 API。

library(taxize)
gbif_parse(c('Acanthus ilicifolius L.', 
             'cf. Andrographis paniculata (Burm.f.) Wall. ex Nees', 
             'Ipomoea pes-caprae (L.) DC. subsp. brasiliensis (L.) Ooststr.f'))

#                                                   scientificname       type genusorabove specificepithet authorsparsed    authorship                   canonicalname                canonicalnamewithmarker                                 canonicalnamecomplete bracketauthorship infraspecificepithet  rankmarker
# 1                                        Acanthus ilicifolius L. WELLFORMED     Acanthus     ilicifolius          TRUE            L.            Acanthus ilicifolius                   Acanthus ilicifolius                               Acanthus ilicifolius L.              <NA>                 <NA>       <NA>
# 2            cf. Andrographis paniculata (Burm.f.) Wall. ex Nees   INFORMAL Andrographis      paniculata          TRUE Wall. ex Nees         Andrographis paniculata                Andrographis paniculata      Andrographis paniculata (Burm. f.) Wall. ex Nees          Burm. f.                 <NA>       <NA>
# 3 Ipomoea pes-caprae (L.) DC. subsp. brasiliensis (L.) Ooststr.f    SCINAME      Ipomoea      pes-caprae          TRUE     Ooststr.f Ipomoea pes-caprae brasiliensis Ipomoea pes-caprae subsp. brasiliensis Ipomoea pes-caprae subsp. brasiliensis (L.) Ooststr.f                L.         brasiliensis     subsp.

有关详细信息,请参阅 ?gbif_parse。您还可以找到 GBIF on github.

taxize 也利用了 EOL API - 参见 ?gni_parse.