Padronização de nomes científicos

Taxonomia
Dendrologia
Organizar a lista de espécies de um levantamento florístico, contar famílias, gêneros, espécies, cf., aff. e indeterminadas, e validar os nomes no TNRS (WFO e WCVP) e na Flora e Funga do Brasil.
Autor

LEDT/UFAM

Nível: iniciante/intermediário · Pacotes: R básico; TNRS e flora (validação online) · Disciplina: FGD921 - Dendrologia Tropical · Baixar script · Baixar a lista de espécies · Versão no Excel (Plantminer + Flora e Funga)

Listas de espécies de inventários florestais costumam ter erros de grafia, nomes desatualizados (sinônimos), famílias de sistemas de classificação antigos e identificações incompletas (sp., cf., aff.). Antes de qualquer análise, é preciso padronizar e validar esses nomes.

Esta rotina faz em R o mesmo que a prática da aula faz com o Plantminer e a Flora e Funga do Brasil: organizar a lista → contar → validar em bases de referência → comparar com a lista original. Prefere não programar? Siga a versão no Excel.

1. Os dados

Usamos a lista de 240 espécies do levantamento de Oliveira & Amaral (2004), numa floresta de vertente na Amazônia Central, adaptada para a prática da disciplina. As colunas são:

Coluna Descrição
familia família, como no artigo original (2004)
nome_cientifico gênero e epíteto (com cf. ou aff., quando houver)
rank nível de identificação: espécie, gênero, família ou indeterminada
status sp., sp.1, sp.2, cf. ou aff.
habito árvore, palmeira ou liana
sp <- read.csv("../dados/especies_oliveira_amaral2004.csv")
str(sp)
'data.frame':   240 obs. of  5 variables:
 $ familia        : chr  "Anacardiaceae" "Anacardiaceae" "Annonaceae" "Annonaceae" ...
 $ nome_cientifico: chr  "Anacardium giganteum" "Astronium " "Duguetia chrysea" "Duguetia surinamensis" ...
 $ rank           : chr  "espécie" "gênero" "espécie" "espécie" ...
 $ status         : chr  "" "sp." "" "" ...
 $ habito         : chr  "árvore" "árvore" "árvore" "árvore" ...
head(sp)
        familia         nome_cientifico    rank status habito
1 Anacardiaceae    Anacardium giganteum espécie        árvore
2 Anacardiaceae              Astronium   gênero    sp. árvore
3    Annonaceae        Duguetia chrysea espécie        árvore
4    Annonaceae   Duguetia surinamensis espécie        árvore
5    Annonaceae Ephedranthus amazonicus espécie        árvore
6    Annonaceae      Guatteria discolor espécie        árvore

2. Limpeza básica

Planilhas digitadas à mão quase sempre têm espaços sobrando (por exemplo, "Astronium " e "Rinorea guianensis "). Eles parecem invisíveis, mas fazem o R tratar nomes iguais como diferentes:

sum(grepl("^\\s|\\s$", sp$nome_cientifico))      # nomes com espaço no início ou no fim
[1] 36
sp$nome_cientifico <- trimws(gsub("\\s+", " ", sp$nome_cientifico))
sp$status[is.na(sp$status)] <- ""

Também montamos o nome completo, juntando o sp. aos registros identificados só até gênero ou família:

sp$nome <- ifelse(sp$rank %in% c("gênero", "família", "indeterminada"),
                  paste(sp$nome_cientifico, sp$status), sp$nome_cientifico)
sp$genero <- ifelse(sp$rank %in% c("espécie", "gênero"), sub(" .*", "", sp$nome_cientifico), NA)
exemplos <- c(which(sp$rank == "gênero")[1:2], which(sp$status == "cf.")[1],
              which(sp$rank %in% c("família", "indeterminada")))
sp[exemplos, c("familia", "nome", "rank", "status")]
          familia                 nome          rank status
2   Anacardiaceae        Astronium sp.        gênero    sp.
10     Annonaceae         Duguetia sp.        gênero    sp.
22    Burseraceae Protium cf. carnosum       espécie    cf.
111      Fabaceae         Fabaceae sp.       família    sp.
119 Indeterminada    Indeterminada sp. indeterminada    sp.
233      Ulmaceae         Ulmaceae sp.       família    sp.

Nomes repetidos

Uma lista de espécies não deveria ter o mesmo nome duas vezes:

dup <- sp$nome[duplicated(sp$nome)]
sp[sp$nome %in% dup, c("familia", "nome")]
          familia                  nome
82  Euphorbiaceae Conceveiba guianensis
137 Lecythidaceae Conceveiba guianensis

3. Respondendo às perguntas da prática (lista original)

Com a lista organizada, as contagens são diretas:

c(
  familias           = length(unique(sp$familia[sp$familia != "Indeterminada"])),
  generos            = length(unique(na.omit(sp$genero))),
  especies           = sum(sp$rank == "espécie"),
  ate_genero         = sum(sp$rank == "gênero"),
  ate_familia        = sum(sp$rank == "família"),
  indeterminadas     = sum(sp$rank == "indeterminada"),
  com_cf             = sum(sp$status == "cf."),
  com_aff            = sum(sp$status == "aff.")
)
      familias        generos       especies     ate_genero    ate_familia 
            49            115            202             35              2 
indeterminadas         com_cf        com_aff 
             1             18              2 
riqueza <- sort(table(sp$familia), decreasing = TRUE)[1:15]
par(mar = c(4, 10, 1, 1))
barplot(rev(riqueza), horiz = TRUE, las = 1, col = "#78c2ad", border = NA,
        xlab = "Número de espécies")

Número de espécies por família na lista original (as 15 famílias mais ricas).

Número de espécies por família na lista original (as 15 famílias mais ricas).

4. Validar os nomes no TNRS

As perguntas mais interessantes da prática dependem de comparar a lista com uma base atualizada: quais nomes mudaram, quais são sinônimos, quais estavam com erro de grafia e quais famílias deixaram de existir (por exemplo, Caesalpiniaceae e Mimosaceae hoje estão em Fabaceae).

O TNRS (Taxonomic Name Resolution Service) compara os nomes com a WFO (World Flora Online) e a WCVP (Kew), corrige erros de grafia e indica se o nome é aceito ou sinônimo.

Os blocos abaixo não são executados no site, porque dependem da internet e da versão atual das bases. Rode no seu computador.

Enviamos só os nomes identificados até espécie, sem o cf. e o aff. (que indicam dúvida na identificação e não fazem parte do nome):

install.packages("TNRS")
library(TNRS)

sp$busca <- gsub("\\s(cf|aff)\\.\\s", " ", sp$nome_cientifico)
nomes_especie <- unique(sp$busca[sp$rank == "espécie"])

res <- TNRS(nomes_especie, sources = c("wfo", "wcvp"))

res[, c("Name_submitted", "Name_matched", "Overall_score",
        "Taxonomic_status", "Accepted_name", "Accepted_family")]

Como ler o resultado:

Coluna O que significa
Name_matched nome encontrado na base (já com a grafia corrigida)
Overall_score semelhança com o nome enviado (1 = idêntico); valores menores indicam erro de grafia
Taxonomic_status Accepted (aceito), Synonym (sinônimo) ou No opinion
Accepted_name nome que deve ser usado
Accepted_family família segundo a classificação atual (APG)

Comparando com a lista original

comp <- merge(sp[sp$rank == "espécie", c("familia", "nome_cientifico", "busca")],
              res[, c("Name_submitted", "Name_matched", "Overall_score",
                      "Taxonomic_status", "Accepted_name", "Accepted_family")],
              by.x = "busca", by.y = "Name_submitted", all.x = TRUE)

# Quantas espécies tiveram o nome alterado desde 2004 (sinônimos)?
sinonimos <- subset(comp, Taxonomic_status == "Synonym", c(nome_cientifico, Accepted_name))
nrow(sinonimos); sinonimos

# Quais estavam escritas incorretamente?
subset(comp, Overall_score < 1, c(nome_cientifico, Name_matched, Overall_score))

# Quais não foram encontradas?
subset(comp, is.na(Accepted_name) | Accepted_name == "", nome_cientifico)

# Alguma espécie mudou de família?
mudou_familia <- subset(comp, familia != Accepted_family,
                        c(nome_cientifico, familia, Accepted_family))
table(paste(mudou_familia$familia, "→", mudou_familia$Accepted_family))

# Alguma mudou de gênero?
subset(comp, sub(" .*", "", busca) != sub(" .*", "", Accepted_name),
       c(nome_cientifico, Accepted_name))

Por fim, salvamos a lista padronizada:

write.csv(comp, "resultados/lista_padronizada.csv", row.names = FALSE)

5. Conferir na Flora e Funga do Brasil

Para espécies brasileiras, a referência oficial é a Flora e Funga do Brasil. O pacote flora consulta essa base:

install.packages("flora")
library(flora)

ffb <- get.taxa(nomes_especie, life.form = TRUE, habitat = TRUE, domain = TRUE)
ffb[, c("original.search", "search.str", "family", "taxon.status", "notes")]

Quando as bases discordam, a decisão é taxonômica: consulte a literatura recente (revisões, monografias) e o especialista do grupo. Use outras bases quando for preciso (Tropicos, POWO, IPNI, WFO) e registre sempre qual base e qual data de consulta você usou.

Boas práticas na escrita de nomes científicos

  • Gênero e epíteto em itálico; autor, cf., aff., sp., spp., subsp., var. e f. em fonte normal.
  • Na primeira citação, escreva o nome por extenso (com autor, se for o caso); depois, o gênero pode ser abreviado (E. coriacea), exceto no início de frases.
  • Com sp. e spp., o gênero nunca é abreviado: Pouteria sp.

Referências

  • BOYLE, B. et al. 2013. The taxonomic name resolution service: an online tool for automated standardization of plant names. BMC Bioinformatics 14: 16.
  • CARVALHO, G. flora: tools for interacting with the Brazilian Flora 2020. Pacote R. https://CRAN.R-project.org/package=flora
  • OLIVEIRA, A. N.; AMARAL, I. L. 2004. Florística e fitossociologia de uma floresta de vertente na Amazônia Central, Amazonas, Brasil. Acta Amazonica 34(1): 21-34.
  • International Code of Nomenclature for algae, fungi, and plants (Código de Madri), 18ª edição, 2025.