species names matched to their accepted names, offline
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
19taxon backbones: global checklists (Catalogue of Life, GBIF, ITIS, NCBI, Open Tree of Life) and the authorities of single groups (World Flora Online, 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,
109of them, from the IUCN Red List 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, cite() prints the references of every
backbone and dataset a result used, and taxify_lock() saves the
versions 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.
install.packages("taxify")
# or the development version
# install.packages("pak")
# pak::pak("gcol33/taxify")
install.packages("taxify", repos = c('https://gcol33.r-universe.dev', 'https://cloud.r-project.org'))
The first call to taxify() downloads the Catalogue of Life (COL), the
GBIF Backbone Taxonomy and the Integrated Taxonomic Information System
(ITIS), about 4 GB in all. Later calls read them from disk.
Match the names with taxify().
Look at the matches that need a decision with inspect().
Join data on the accepted name with add_data() for your own table,
or with an add_<source>() function for a published dataset.
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;
backbone = c("wfo", "col") names the chain.
inspect(res)
#> ── taxify inspection ──────────────────────────────────────────
#> 4 names inspected | 3 with anomalies
#> backbones: col, gbif, itis
#> review: 2 note: 1
#> ────────────────────────────────────────────────────────────
#> [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.
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.
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.
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.
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.
Start with Get started: one path from a messy list to accepted names with traits attached.
Choosing and combining backbones: which backbone for which group, fallback chains, versions.
Checking a name
list:
every label of inspect(), and reconcile() for a checklist.
Matching within a region: preferring the species that occur where the list was made.
Attaching published data and Joining your own data: the two kinds of join.
Exploring the backbone: synonyms, children, classification and common names.
Requesting GBIF data for a species list: from matched names to an occurrence download.
Matching vegetation units: alliances and associations against the EuroVegChecklist.
Matching large lists: timings, memory, and long lists run in parts.
How names are matched and Hybrids and aggregates: the matching rules in detail.
Compatibility with taxize and WorldFlora: agreement with WorldFlora, function mapping and timings.
The backbones and datasets: every backbone and dataset with its version, licence and reference.
Full reference: every function, grouped by job.
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.
Pull requests are welcome; see the contributing guide.
“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.
The backbones and datasets are the work of the institutions and authors
who compile and publish them; cite() lists the reference for each one
a result used.
MIT.
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/>.
A BibTeX entry for LaTeX users is
@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/},
}