# Getting Started with perumammals

#### Paul Efren Santos Andrade

#### 2025-12-19

## Introduction

The perumammals package provides tools for working with Peru’s mammalian biodiversity. It includes a curated taxonomic backbone based on Pacheco et al. (2021), the most comprehensive and up-to-date synthesis of Peruvian mammal diversity.

This vignette will show you how to:

- Install and load the package
- Access the mammal species data
- Validate species names
- Identify endemic species
- Explore species by ecoregion
- Work with taxonomic families

## Installation

You can install the development version of perumammals from GitHub:

    # Using pak (recommended)
    pak::pak("PaulESantos/perumammals")

    # Or using remotes
    remotes::install_github("PaulESantos/perumammals")

## Loading the package

    library(perumammals)

## Available dataset

The main dataset included in the package is the species list provided as an appendix in Pacheco et al. (2021):

    # Main species backbone
    data(peru_mammals)
    head(peru_mammals)
    #>       pm_id        order          family        genus     species
    #> 1 M0542_EUB Artiodactyla      Balaenidae    Eubalaena   australis
    #> 2 M0543_BAL Artiodactyla Balaenopteridae Balaenoptera bonaerensis
    #> 3 M0544_BAL Artiodactyla Balaenopteridae Balaenoptera    borealis
    #> 4 M0545_BAL Artiodactyla Balaenopteridae Balaenoptera       edeni
    #> 5 M0546_BAL Artiodactyla Balaenopteridae Balaenoptera    musculus
    #> 6 M0547_BAL Artiodactyla Balaenopteridae Balaenoptera    physalus
    #>            scientific_name                      scientific_name_full
    #> 1      Eubalaena australis    Eubalaena australis (Desmoulins, 1822)
    #> 2 Balaenoptera bonaerensis Balaenoptera bonaerensis Burmeister, 1867
    #> 3    Balaenoptera borealis        Balaenoptera borealis Lesson, 1828
    #> 4       Balaenoptera edeni         Balaenoptera edeni Anderson, 1879
    #> 5    Balaenoptera musculus    Balaenoptera musculus (Linnaeus, 1758)
    #> 6    Balaenoptera physalus    Balaenoptera physalus (Linnaeus, 1758)
    #>               author                     common_name endemic ecoregions
    #> 1 (Desmoulins, 1822)          Ballena franca del sur   FALSE        OCE
    #> 2   Burmeister, 1867           Ballena minke austral   FALSE        OCE
    #> 3       Lesson, 1828                  Ballena de Sei   FALSE        OCE
    #> 4     Anderson, 1879                Ballena de Bryde   FALSE        OCE
    #> 5   (Linnaeus, 1758)   Rorcual gigante, ballena azul   FALSE        OCE
    #> 6   (Linnaeus, 1758) Rorcual común, ballena de aleta   FALSE        OCE
    #>               reference
    #> 1            Reyes 2009
    #> 2            Reyes 2009
    #> 3 Jefferson et al. 1993
    #> 4            Reyes 2009
    #> 5 Jefferson et al. 1993
    #> 6 Jefferson et al. 1993

## Basic name validation

The core function `validate_peru_mammals()` checks if species names are present in the Peruvian mammal checklist:

    # Single species
    species_list <- c(
      "Puma concolor",           # Valid name
      "Tremarctos ornatus",      # Valid name
      "Panthera onca",           # Valid name
      "Lycalopex sechurae",      # Valid name
      "Odocoileus virginianus",  # Valid name
      "Puma concolar"            # Misspelled
    )

    results <- validate_peru_mammals(species_list)
    results
    #>   sorter              Orig.Name       Matched.Name            Match.Level
    #> 1      1          Puma concolor      Puma concolor             Exact rank
    #> 2      2     Tremarctos ornatus Tremarctos ornatus             Exact rank
    #> 3      3          Panthera onca      Panthera onca             Exact rank
    #> 4      4     Lycalopex sechurae Lycalopex sechurae             Exact rank
    #> 5      5 Odocoileus virginianus         Odocoileus Matched at higher rank
    #> 6      6          Puma concolar      Puma concolor             Exact rank
    #>   matched Rank Matched.Rank Comp.Rank valid_rank Orig.Genus Orig.Species Author
    #> 1    TRUE    2            2      TRUE       TRUE       PUMA     CONCOLOR
    #> 2    TRUE    2            2      TRUE       TRUE TREMARCTOS      ORNATUS
    #> 3    TRUE    2            2      TRUE       TRUE   PANTHERA         ONCA
    #> 4    TRUE    2            2      TRUE       TRUE  LYCALOPEX     SECHURAE
    #> 5   FALSE    2            1     FALSE      FALSE ODOCOILEUS  VIRGINIANUS
    #> 6    TRUE    2            2      TRUE       TRUE       PUMA     CONCOLAR
    #>   Matched.Genus Matched.Species genus_dist species_dist    scientific_name
    #> 1          PUMA        CONCOLOR          0            0      Puma concolor
    #> 2    TREMARCTOS         ORNATUS          0            0 Tremarctos ornatus
    #> 3      PANTHERA            ONCA          0            0      Panthera onca
    #> 4     LYCALOPEX        SECHURAE          0            0 Lycalopex sechurae
    #> 5    ODOCOILEUS            <NA>          0           NA               <NA>
    #> 6          PUMA        CONCOLOR          0            1      Puma concolor
    #>                       common_name  family     order endemic
    #> 1        Puma, león, lluichu-puma Felidae Carnivora   FALSE
    #> 2 Oso de anteojos, ucumari, ucucu Ursidae Carnivora   FALSE
    #> 3      Jaguar, otorongo, uturuncu Felidae Carnivora   FALSE
    #> 4                Zorro de Sechura Canidae Carnivora   FALSE
    #> 5                            <NA>    <NA>      <NA>      NA
    #> 6        Puma, león, lluichu-puma Felidae Carnivora   FALSE

## Quick checks with wrapper functions

### Check if species occur in Peru

    # Returns TRUE/FALSE
    is_peru_mammal(species_list)
    #> [1] "Found in Peru" "Found in Peru" "Found in Peru" "Found in Peru"
    #> [5] "Not found"     "Found in Peru"

### Identify endemic species

    # Check which species are endemic to Peru
    species_list <- c("Thomasomys notatus", "Tremarctos ornatus", "Eptesicus mochica", "Puma concolar")

    is_endemic_peru(species_list)
    #> [1] "Endemic to Peru" "Not endemic"     "Endemic to Peru" "Not endemic"

    # Get endemic status as character
    endemic_status <- ifelse(
      is_endemic_peru(species_list) == "Endemic to Peru",
      "Endémica",
      "No endémica"
    )
    endemic_status
    #> [1] "Endémica"    "No endémica" "Endémica"    "No endémica"

### Check match quality

    # Get match quality levels
    match_quality_peru(species_list)
    #> [1] "Exact" "Exact" "Exact" "Fuzzy"

## Working with data frames

The validation functions integrate smoothly with data frames and the tidyverse:

    library(dplyr)

    # Create a sample dataset
    my_data <- tibble(
      species = species_list,
      abundance = c(5, 3, 2, 8)
    )

    # Add validation results
    my_data_validated <- my_data |>
      mutate(
        in_peru = is_peru_mammal(species),
        endemic = is_endemic_peru(species),
        match_quality = match_quality_peru(species)
      )

    my_data_validated
    #> # A tibble: 4 × 5
    #>   species            abundance in_peru       endemic         match_quality
    #>   <chr>                  <dbl> <chr>         <chr>           <chr>
    #> 1 Thomasomys notatus         5 Found in Peru Endemic to Peru Exact
    #> 2 Tremarctos ornatus         3 Found in Peru Not endemic     Exact
    #> 3 Eptesicus mochica          2 Found in Peru Endemic to Peru Exact
    #> 4 Puma concolar              8 Found in Peru Not endemic     Fuzzy

## Exploring taxonomic families

### List all families

    # Get summary of all families
    families <- pm_list_families()
    families
    #> # A tibble: 51 × 5
    #>    order        family          n_genera n_species n_endemic
    #>    <chr>        <chr>              <int>     <int>     <int>
    #>  1 Artiodactyla Balaenidae             1         1         0
    #>  2 Artiodactyla Balaenopteridae        2         6         0
    #>  3 Artiodactyla Camelidae              2         4         0
    #>  4 Artiodactyla Cerevidae              5         8         0
    #>  5 Artiodactyla Delphinidae           13        17         0
    #>  6 Artiodactyla Iniidae                1         1         0
    #>  7 Artiodactyla Phocoenidae            1         1         0
    #>  8 Artiodactyla Physeteridae           2         3         0
    #>  9 Artiodactyla Tayassuidae            2         2         0
    #> 10 Artiodactyla Ziphiidae              2         3         0
    #> # ℹ 41 more rows

    # Families with highest species richness
    families |>
      arrange(desc(n_species)) |>
      head(10)
    #> # A tibble: 10 × 5
    #>    order           family           n_genera n_species n_endemic
    #>    <chr>           <chr>               <int>     <int>     <int>
    #>  1 Rodentia        Cricetidae             40       137        47
    #>  2 Chiroptera      Phyllostomidae         38       107         3
    #>  3 Didelphimorphia Didelphidae            15        47        10
    #>  4 Chiroptera      Molossidae              9        30         3
    #>  5 Chiroptera      Vespertilionidae        4        25         3
    #>  6 Primates        Cebidae                 6        23         4
    #>  7 Rodentia        Echimyidae              8        20         3
    #>  8 Artiodactyla    Delphinidae            13        17         0
    #>  9 Chiroptera      Emballonuridae          7        14         0
    #> 10 Primates        Pitheciidae             3        12         4

### Filter by family

    # Get summary for bat species (Phyllostomidae)
    pm_list_families() |>
      filter(family == "Phyllostomidae")
    #> # A tibble: 1 × 5
    #>   order      family         n_genera n_species n_endemic
    #>   <chr>      <chr>             <int>     <int>     <int>
    #> 1 Chiroptera Phyllostomidae       38       107         3

    # Get species list for a specific family
     pm_species(family = "Phyllostomidae")
    #> # A tibble: 107 × 5
    #>    order      family         genus    species       scientific_name
    #>    <chr>      <chr>          <chr>    <chr>         <chr>
    #>  1 Chiroptera Phyllostomidae Anoura   aequatoris    Anoura aequatoris
    #>  2 Chiroptera Phyllostomidae Anoura   caudifer      Anoura caudifer
    #>  3 Chiroptera Phyllostomidae Anoura   cultrata      Anoura cultrata
    #>  4 Chiroptera Phyllostomidae Anoura   fistulata     Anoura fistulata
    #>  5 Chiroptera Phyllostomidae Anoura   geoffroyi     Anoura geoffroyi
    #>  6 Chiroptera Phyllostomidae Anoura   javieri       Anoura javieri
    #>  7 Chiroptera Phyllostomidae Anoura   latidens      Anoura latidens
    #>  8 Chiroptera Phyllostomidae Anoura   peruana       Anoura peruana
    #>  9 Chiroptera Phyllostomidae Artibeus aequatorialis Artibeus aequatorialis
    #> 10 Chiroptera Phyllostomidae Artibeus anderseni     Artibeus anderseni
    #> # ℹ 97 more rows

## Analyzing endemic species

### Get endemic species list

    # List all endemic species
    endemic_mammals <- pm_species(endemic = TRUE)
    endemic_mammals
    #> # A tibble: 87 × 5
    #>    order      family           genus         species   scientific_name
    #>    <chr>      <chr>            <chr>         <chr>     <chr>
    #>  1 Chiroptera Molossidae       Eumops        chiribaya Eumops chiribaya
    #>  2 Chiroptera Molossidae       Mormopterus   phrudus   Mormopterus phrudus
    #>  3 Chiroptera Molossidae       Tomopeas      ravus     Tomopeas ravus
    #>  4 Chiroptera Phyllostomidae   Anoura        javieri   Anoura javieri
    #>  5 Chiroptera Phyllostomidae   Hsunycteris   dashe     Hsunycteris dashe
    #>  6 Chiroptera Phyllostomidae   Micronycteris matses    Micronycteris matses
    #>  7 Chiroptera Vespertilionidae Eptesicus     mochica   Eptesicus mochica
    #>  8 Chiroptera Vespertilionidae Lasiurus      arequipae Lasiurus arequipae
    #>  9 Chiroptera Vespertilionidae Myotis        bakeri    Myotis bakeri
    #> 10 Cingulata  Dasypodidae      Dasypus       pilosus   Dasypus pilosus
    #> # ℹ 77 more rows

    # Endemic species by family
    endemic_mammals |>
      group_by(family) |>
      summarise(n_species = n_distinct(scientific_name)) |>
      arrange(desc(n_species)) |>
      head(10)
    #> # A tibble: 10 × 2
    #>    family           n_species
    #>    <chr>                <int>
    #>  1 Cricetidae              47
    #>  2 Didelphidae             10
    #>  3 Cebidae                  4
    #>  4 Pitheciidae              4
    #>  5 Echimyidae               3
    #>  6 Molossidae               3
    #>  7 Phyllostomidae           3
    #>  8 Vespertilionidae         3
    #>  9 Abrocomidae              2
    #> 10 Soricidae                2

### Endemic species by ecoregion

    # Compare endemism across ecoregions
    endemic_rate <- pm_list_ecoregions(include_endemic = TRUE)
    #> ── Peruvian Mammal Ecoregions (Brack-Egg, 1986) ────────────────────────────────
    #> ℹ Number of ecoregions: 10
    #> ℹ Total mammal species in Peru: 573
    #>
    #> Ecoregions by species richness:
    #>
    #> SB - Selva Baja: 320 species (55.8%), 18 endemic (5.6%)
    #> YUN - Yungas: 256 species (44.7%), 48 endemic (18.8%)
    #> SP - Sabana de Palmera: 83 species (14.5%), 0 endemic (0%)
    #> BSE - Bosque Seco Ecuatorial: 81 species (14.1%), 4 endemic (4.9%)
    #> VOC - Vertiente Occidental: 72 species (12.6%), 15 endemic (20.8%)
    #> PUN - Puna: 71 species (12.4%), 14 endemic (19.7%)
    #> BPP - Bosque Pluvial del Pacífico: 69 species (12%), 0 endemic (0%)
    #> COS - Costa: 66 species (11.5%), 16 endemic (24.2%)
    #> OCE - Oceánica: 30 species (5.2%), 0 endemic (0%)
    #> PAR - Páramo: 26 species (4.5%), 4 endemic (15.4%)
    #>
    #> Use pm_by_ecoregion() to filter species by ecoregion
    #> ────────────────────────────────────────────────────────────────────────────────
    endemic_rate
    #> # A tibble: 10 × 6
    #>    ecoregion_code ecoregion_label    n_species n_endemic pct_species pct_endemic
    #>    <chr>          <chr>                  <int>     <int>       <dbl>       <dbl>
    #>  1 SB             Selva Baja               320        18        55.8         5.6
    #>  2 YUN            Yungas                   256        48        44.7        18.8
    #>  3 SP             Sabana de Palmera         83         0        14.5         0
    #>  4 BSE            Bosque Seco Ecuat…        81         4        14.1         4.9
    #>  5 VOC            Vertiente Occiden…        72        15        12.6        20.8
    #>  6 PUN            Puna                      71        14        12.4        19.7
    #>  7 BPP            Bosque Pluvial de…        69         0        12           0
    #>  8 COS            Costa                     66        16        11.5        24.2
    #>  9 OCE            Oceánica                  30         0         5.2         0
    #> 10 PAR            Páramo                    26         4         4.5        15.4

    # Endemic species in Yungas
    pm_by_ecoregion(ecoregion = "YUN", endemic = TRUE)
    #> # A tibble: 48 × 5
    #>    order           family         genus       species     scientific_name
    #>    <chr>           <chr>          <chr>       <chr>       <chr>
    #>  1 Chiroptera      Molossidae     Mormopterus phrudus     Mormopterus phrudus
    #>  2 Chiroptera      Phyllostomidae Anoura      javieri     Anoura javieri
    #>  3 Cingulata       Dasypodidae    Dasypus     pilosus     Dasypus pilosus
    #>  4 Didelphimorphia Didelphidae    Marmosa     andersoni   Marmosa andersoni
    #>  5 Didelphimorphia Didelphidae    Marmosa     parda       Marmosa parda
    #>  6 Didelphimorphia Didelphidae    Marmosops   juninensis  Marmosops juninensis
    #>  7 Didelphimorphia Didelphidae    Monodelphis gardeni     Monodelphis gardeni
    #>  8 Didelphimorphia Didelphidae    Philander   nigratus    Philander nigratus
    #>  9 Eulipotyphla    Soricidae      Cryptotis   evaristoi   Cryptotis evaristoi
    #> 10 Eulipotyphla    Soricidae      Cryptotis   peruviensis Cryptotis peruviensis
    #> # ℹ 38 more rows

## Ecoregion analysis

### Species distribution across ecoregions

    # Count species per ecoregion
    pm_list_ecoregions()
    #> ── Peruvian Mammal Ecoregions (Brack-Egg, 1986) ────────────────────────────────
    #> ℹ Number of ecoregions: 10
    #> ℹ Total mammal species in Peru: 573
    #>
    #> Ecoregions by species richness:
    #>
    #> SB - Selva Baja: 320 species (55.8%)
    #> YUN - Yungas: 256 species (44.7%)
    #> SP - Sabana de Palmera: 83 species (14.5%)
    #> BSE - Bosque Seco Ecuatorial: 81 species (14.1%)
    #> VOC - Vertiente Occidental: 72 species (12.6%)
    #> PUN - Puna: 71 species (12.4%)
    #> BPP - Bosque Pluvial del Pacífico: 69 species (12%)
    #> COS - Costa: 66 species (11.5%)
    #> OCE - Oceánica: 30 species (5.2%)
    #> PAR - Páramo: 26 species (4.5%)
    #>
    #> Use pm_by_ecoregion() to filter species by ecoregion
    #> Use include_endemic = TRUE to see endemic species counts
    #> ────────────────────────────────────────────────────────────────────────────────

### Species with widest distribution

    # Species occurring in most ecoregions
    peru_mammals_ecoregions |>
      count(scientific_name, name = "n_ecoregions") |>
      arrange(desc(n_ecoregions)) |>
      top_n(10)
    #> Selecting by n_ecoregions
    #> # A tibble: 12 × 2
    #>    scientific_name          n_ecoregions
    #>    <chr>                           <int>
    #>  1 Puma concolor                       8
    #>  2 Desmodus rotundus                   7
    #>  3 Molossus molossus                   7
    #>  4 Odocoileus peruvianus               7
    #>  5 Conepatus semistriatus              6
    #>  6 Lasiurus blossevillii               6
    #>  7 Leopardus pardalis                  6
    #>  8 Mazama americana                    6
    #>  9 Myotis keaysi                       6
    #> 10 Myotis nigricans                    6
    #> 11 Rhipidomys leucodactylus            6
    #> 12 Tamandua tetradactyla               6

## Practical examples

### Example 1: Data cleaning workflow

    # Messy species list from field observations
    field_data <- tibble(
      location = c("Manu", "Tambopata", "Paracas", "Cusco", "Lima"),
      species_name = c(
        "puma concolor",           # lowercase
        "Tremarctos ornatu",       # missing 's'
        "Otaria flavescens",       # marine mammal
        "Lycalopex sechure",       # missing 'ae'
        "Unknown bat"              # invalid
      ),
      count = c(2, 1, 15, 3, 8)
    )

    # Validate and clean
    field_data_clean <- field_data %>%
      mutate(
        # Validate names
        validated = validate_peru_mammals(species_name)$Matched.Name,
        # Check if in Peru
        in_checklist = is_peru_mammal(species_name),
        # Get match quality
        quality = match_quality_peru(species_name)
      )

    field_data_clean
    #> # A tibble: 5 × 6
    #>   location  species_name      count validated          in_checklist  quality
    #>   <chr>     <chr>             <dbl> <chr>              <chr>         <chr>
    #> 1 Manu      puma concolor         2 Puma concolor      Found in Peru Exact
    #> 2 Tambopata Tremarctos ornatu     1 Tremarctos ornatus Found in Peru Fuzzy
    #> 3 Paracas   Otaria flavescens    15 Otaria flavescens  Found in Peru Exact
    #> 4 Cusco     Lycalopex sechure     3 Lycalopex sechurae Found in Peru Fuzzy
    #> 5 Lima      Unknown bat           8 ---                Not found     Not found

### Example 2: Endemic species summary

    # Get all endemic mammals
    endemic_species <- pm_species(endemic = TRUE)
    endemic_species
    #> # A tibble: 87 × 5
    #>    order      family           genus         species   scientific_name
    #>    <chr>      <chr>            <chr>         <chr>     <chr>
    #>  1 Chiroptera Molossidae       Eumops        chiribaya Eumops chiribaya
    #>  2 Chiroptera Molossidae       Mormopterus   phrudus   Mormopterus phrudus
    #>  3 Chiroptera Molossidae       Tomopeas      ravus     Tomopeas ravus
    #>  4 Chiroptera Phyllostomidae   Anoura        javieri   Anoura javieri
    #>  5 Chiroptera Phyllostomidae   Hsunycteris   dashe     Hsunycteris dashe
    #>  6 Chiroptera Phyllostomidae   Micronycteris matses    Micronycteris matses
    #>  7 Chiroptera Vespertilionidae Eptesicus     mochica   Eptesicus mochica
    #>  8 Chiroptera Vespertilionidae Lasiurus      arequipae Lasiurus arequipae
    #>  9 Chiroptera Vespertilionidae Myotis        bakeri    Myotis bakeri
    #> 10 Cingulata  Dasypodidae      Dasypus       pilosus   Dasypus pilosus
    #> # ℹ 77 more rows
    # Total endemic species by order
    endemic_species |>
      count(order, name = "n_endemic") |>
      arrange(desc(n_endemic))
    #> # A tibble: 6 × 2
    #>   order           n_endemic
    #>   <chr>               <int>
    #> 1 Rodentia               56
    #> 2 Didelphimorphia        10
    #> 3 Chiroptera              9
    #> 4 Primates                9
    #> 5 Eulipotyphla            2
    #> 6 Cingulata               1

### Example 3: Ecoregion-specific analysis

    # Focus on Selva Baja (Amazon lowlands)

    selva_baja_species <- pm_by_ecoregion(ecoregion = "SB")
    selva_baja_species
    #> # A tibble: 320 × 5
    #>    order        family      genus       species     scientific_name
    #>    <chr>        <chr>       <chr>       <chr>       <chr>
    #>  1 Artiodactyla Cerevidae   Blastocerus dichotomus  Blastocerus dichotomus
    #>  2 Artiodactyla Cerevidae   Mazama      americana   Mazama americana
    #>  3 Artiodactyla Cerevidae   Mazama      nemorivaga  Mazama nemorivaga
    #>  4 Artiodactyla Cerevidae   Odocoileus  peruvianus  Odocoileus peruvianus
    #>  5 Artiodactyla Delphinidae Sotalia     fluviatilis Sotalia fluviatilis
    #>  6 Artiodactyla Iniidae     Inia        geoffrensis Inia geoffrensis
    #>  7 Artiodactyla Tayassuidae Dicotyles   tajacu      Dicotyles tajacu
    #>  8 Artiodactyla Tayassuidae Tayassu     pecari      Tayassu pecari
    #>  9 Carnivora    Canidae     Atelocynus  microtis    Atelocynus microtis
    #> 10 Carnivora    Canidae     Speothos    venaticus   Speothos venaticus
    #> # ℹ 310 more rows

    # Endemic species in Selva Baja
    pm_by_ecoregion(ecoregion = "SB", endemic = TRUE) |>
      count(family, name = "n_species") |>
      arrange(desc(n_species))
    #> # A tibble: 7 × 2
    #>   family         n_species
    #>   <chr>              <int>
    #> 1 Cebidae                4
    #> 2 Didelphidae            4
    #> 3 Pitheciidae            4
    #> 4 Cricetidae             2
    #> 5 Phyllostomidae         2
    #> 6 Echimyidae             1
    #> 7 Sciuridae              1

## Advanced: Fuzzy matching details

The validation algorithm uses a hierarchical matching approach:

1. Exact match: Perfect match with accepted name
2. Genus + fuzzy species: Genus exact, species with small differences
3. Fuzzy genus + exact species: Species exact, genus with small differences
4. Double fuzzy: Both genus and species with small differences
5. No match: No acceptable match found

    # Examples of different match levels
    test_names <- c(
      "Puma concolor",              # Level: Exact
      "Tremarctos ornatus Cuvier",
      "Lycalopex sechure",          # Level: Genus + fuzzy species
      "Lyclopex sechurae",          # Level: Fuzzy genus + exact species
      "Panthera onca"               # Level: Exact
    )

    validate_peru_mammals(test_names) |>
      select(Orig.Name, Matched.Name, matched)
    #> Warning: Found 1 name(s) with 3+ elements (likely author info or infraspecies).
    #> The peru_mammals database only accepts binomial names (Genus species).
    #> Please provide names WITHOUT author information or infraspecific taxa.
    #>
    #> Invalid names:
    #>   - 'Tremarctos ornatus cuvier'
    #>
    #> These names have been marked as NOT FOUND.
    #>                   Orig.Name       Matched.Name matched
    #> 1             Puma concolor      Puma concolor    TRUE
    #> 2 Tremarctos ornatus cuvier                ---   FALSE
    #> 3         Lycalopex sechure Lycalopex sechurae    TRUE
    #> 4         Lyclopex sechurae Lycalopex sechurae    TRUE
    #> 5             Panthera onca      Panthera onca    TRUE

## Citation

When using this package, please cite both the package and the source data:

    citation("perumammals")

Package citation: Santos Andrade, P. E., & Gonzales Guillen, F. N. (2025). perumammals: Taxonomic Backbone and Name Validation Tools for Mammals of Peru.

Data source: Pacheco, V., Cadenillas, R., Zeballos, H., Hurtado, C. M., Ruelas, D., & Pari, A. (2021). Lista actualizada de la diversidad de los mamíferos del Perú y una propuesta para su actualización. Revista Peruana de Biología, 28(special issue), e21019. https://doi.org/10.15381/rpb.v28i4.21019