Offline Taxonomic Name Matching Against Darwin Core Backbones

Matches taxonomic names against local copies of published backbones ('Catalogue of Life', 'GBIF Backbone Taxonomy', 'ITIS', 'World Flora Online', 'WoRMS', 'NCBI Taxonomy', 'Open Tree of Life', 'Euro+Med', 'Species Fungorum', 'AlgaeBase', 'FishBase', 'SeaLifeBase', 'Reptile Database', 'LCVP', 'WCVP', 'Mammal Diversity Database', 'AviList', 'LPSN') and two vegetation classifications, and resolves each name to its accepted name. It performs the name-resolution step of 'taxize' and 'WorldFlora', run offline against these files. Names are cleaned of authors and qualifiers, matched exactly and then by edit distance within their genus, and followed from synonym to accepted name, with the backbone version recorded on every row. Published trait, status and distribution datasets are joined on the accepted name, and so is a table the user supplies. Matching runs in the 'vectra' column-store engine.


taxify taxify logo

species names matched to their accepted names, offline

CRAN status CRAN downloads Monthly downloads R-CMD-check Codecov test coverage License: MIT

taxify matches taxonomic names, such as a field survey’s species list or the species column of a trait table, to the name each taxon currently carries, its accepted name.

The package performs the name-resolution step of taxize and WorldFlora, run offline against local backbone files. A backbone is a published taxonomic database, such as the Catalogue of Life or World Flora Online, downloaded once and stored on your disk. Each name comes back with its accepted name, how it was matched, and the backbone version that matched it, so you can review the uncertain matches and decide which to keep. taxify supports:

  • Backbones for every group. taxify reads 19 taxon backbones: global checklists (the Catalogue of Life, the GBIF Backbone Taxonomy of the Global Biodiversity Information Facility, the Integrated Taxonomic Information System (ITIS), the NCBI Taxonomy of the US National Center for Biotechnology Information and the Open Tree of Life) and the authorities of single groups (World Flora Online, the World Register of Marine Species (WoRMS), Species Fungorum, AlgaeBase, FishBase, the Mammal Diversity Database, AviList and others), all returning the same columns. Several backbones form a fallback chain, so a name one backbone lacks is matched by the next.

  • Published data on the accepted name. Trait, status and distribution datasets, 109 of them, from the Red List of the International Union for Conservation of Nature (IUCN) to seed mass and fish morphology, are joined by the accepted name, so a dataset that writes a synonym still lines up. add_trait() gathers one trait from every dataset that carries it.

  • Checking a list. inspect() returns only the names that need a look (typos, outdated synonyms, spellings shared by several taxa, unknown genera, an animal in a plant list), each with the name to use.

  • Vegetation units. Two vegetation classifications, the EuroVegChecklist and the Czech national classification, resolve alliance and association names the way species names are resolved.

The accepted name is the backbone’s own, and where backbones disagree, mode = "wide" shows each one’s answer side by side. Every row records the backbone and its version. The references of every backbone and dataset a result used are printed by cite(), and the versions are saved by taxify_lock() so the analysis can be rerun on the same data. A script in the repository matches 300 World Flora Online names in taxify and in WorldFlora; 277 get the same accepted name, and Compatibility with taxize and WorldFlora shows where and why the others differ.

Installation

install.packages("taxify")

# or the development version
# install.packages("pak")
pak::pak("gcol33/taxify")

install_backbones() downloads the Catalogue of Life (COL), the GBIF Backbone Taxonomy and ITIS, about 1.1 GB in all. Matching then reads them from disk, and taxify_clean() removes them again.

Usage

  1. Match the names with taxify().

  2. Look at the matches that need a decision with inspect().

  3. Join data on the accepted name with add_data() for your own table, or with a published dataset’s own function, such as add_iucn().

library(taxify)

names <- c("Quercus robur", "Quercus robus", "Pinus abies",
           "Fallopia japonica")
res <- taxify(names)
#> Matching 4 names against 3 backbones: col -> gbif -> itis
#>   [col] Matching 4 names...
#>   [gbif] Matching 1 remaining names...
#>   [itis] Matching 1 remaining names...
#>   [col] Fuzzy matching 1 unmatched...
#>   [gbif] Skipped (all names matched)
#>   [itis] Skipped (all names matched)
#> Warning: 1 of 4 names resolve to more than one accepted ID (Pinus abies).
#> `accepted_id` holds one and `accepted_ids` all of them; list them with
#> taxify_ids() before requesting data by ID.
res[, c("input_name", "accepted_name", "match_type", "is_synonym")]
#>          input_name       accepted_name match_type is_synonym
#> 1     Quercus robur       Quercus robur      exact      FALSE
#> 2     Quercus robus       Quercus robur      fuzzy      FALSE
#> 3       Pinus abies         Picea abies      exact       TRUE
#> 4 Fallopia japonica Reynoutria japonica      exact       TRUE
#> Sources: COL 2026.09 | cite() for full citations

Quercus robur is matched as written. Quercus robus has a typo and reaches Q. robur by fuzzy matching, which compares it with the names of its own genus. Pinus abies and Fallopia japonica are outdated synonyms of Picea abies and Reynoutria japonica. The warning names an input whose spelling belongs to more than one accepted taxon; the n_ids and accepted_ids columns count and list them.

The input is a character vector of names. Authors, qualifiers such as cf. and agg., capitals and an abbreviated genus are handled before matching. Without backbone, every installed backbone is tried in a fixed priority order, starting with the Catalogue of Life. A vector such as backbone = c("wfo", "col") names the chain.

inspect(res)
#>   Range outlier check skipped: WCVP not installed.
#> ── taxify inspection ──────────────────────────────────────────
#>   4 names inspected  |  3 with anomalies
#>   backbones: col, gbif, itis
#>   review: 2   note: 1
#>   not checked: out_of_range (WCVP range data not installed)
#>   ────────────────────────────────────────────────────────────
#>   [review] Pinus abies        ->  Picea abies          ambiguous (targets: 4HPZF|8K9Y|6BRMR|4HQ4F); outdated synonym
#>   [review] Quercus robus      ->  Quercus robur        likely misspelling
#>   [note  ] Fallopia japonica  ->  Reynoutria japonica  outdated synonym

inspect() labels each name with a tier: review for a match you have to decide on, note for a change you can accept. Get started follows a longer list to a table with traits attached.

Joining data

add_data() matches the names of your own table against the same backbones and joins on the accepted name. Each published dataset has its own function, named after its source:

res |> add_data("my_traits.csv")
res |> add_iucn() |> add_eive()
res |> add_trait("seed_mass")

list_enrichments() lists every published dataset with its version, size and source, and Attaching published data shows the joins in full.

Choosing backbones

Each backbone is downloaded once, as a file built by the companion package taxifydb, and pinned by version. A vector of backbones forms a fallback chain: every backbone is asked for an exact match before any is asked for a fuzzy one.

taxify(names, backbone = c("wfo", "col"))

list_backbones() reports each backbone’s scope, size, version and whether it is installed. Choosing and combining backbones covers the choice per group, downloads and version pinning, and The backbones and datasets describes each one.

Exploring the backbone

The backbone files also answer lookups by synonym, rank and lineage:

synonyms("Picea abies")                     # every synonym of a name
children("Quercus")                         # the species of a genus
upstream("Quercus robur", to = "family")    # the family of a name
sci2comm("Quercus robur")                   # common names
parse_name("Quercus robur (L.) H.Karst.")   # genus, epithet, author

Exploring the backbone shows these and the other lookup functions.

Large lists

Names are matched in C through vectra, the column-store package taxify reads its backbone files with. A fuzzy match compares a name only with the names of its own genus. Matching large lists gives timings for lists up to 100,000 names.

Documentation

Start with Get started: one path from a messy list to accepted names with traits attached.

Getting help

Questions and bug reports go to the GitHub issues. A bug report is easiest to act on with a small reproducible example, for instance made with reprex.

Contributing

Pull requests are welcome; see the contributing guide.

Support

“Software is like sex: it’s better when it’s free.” — Linus Torvalds

I’m a PhD student who builds R packages in my free time because I believe good tools should be free and open. I started these projects for my own work and figured others might find them useful too.

If this package saved you some time, buying me a coffee is a nice way to say thanks. It helps with my coffee addiction.

Buy Me A Coffee

License

taxify is licensed under MIT. Each backbone and dataset keeps the licence of its publisher, listed in The backbones and datasets.

Citation

If you use taxify, please cite the package and the backbones and datasets your results come from. cite() on a taxify result lists their references.

Colling G (2026). _taxify: Offline Taxonomic Name Matching Against
Darwin Core Backbones_. doi:10.32614/CRAN.package.taxify
<https://doi.org/10.32614/CRAN.package.taxify>. R package version
0.7.0, <https://gillescolling.com/taxify/>.

BibTeX:

@Manual{colling2026taxify,
  title = {taxify: Offline Taxonomic Name Matching Against Darwin Core Backbones},
  author = {Gilles Colling},
  year = {2026},
  note = {R package version 0.7.0},
  doi = {10.32614/CRAN.package.taxify},
  url = {https://gillescolling.com/taxify/},
}

Download the citation as BibTeX or RIS.

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.

install.packages("taxify")

0.7.1 by Gilles Colling, a day ago


https://gillescolling.com/taxify/, https://github.com/gcol33/taxify


Report a bug at https://github.com/gcol33/taxify/issues


Browse source code at https://github.com/cran/taxify


Authors: Gilles Colling [aut, cre, cph] (ORCID:


Documentation:   PDF Manual  


MIT + file LICENSE license


Imports curl, jsonlite, rlang, vectra

Suggests ape, DBI, knitr, openxlsx2, rgbif, rmarkdown, RSQLite, sf, taxifydb, terra, testthat, TR8, withr


See at CRAN