2015-01-21 11 views
6

Un nome scientifico di solito consiste in 3 informazioni: Genere, specie epiteto e Autore. Un semplice esempio potrebbe essere il seguente:Dividere nomi scientifici

Acanthus ilicifolius L.

  • Genere: Acanthus
  • Specie epitheton: ilicifolious
  • Autore: L.

facile. Tuttavia, la questione diventa più complicata quando si tratta di ibridi, sottospecie/varietà/forma, diversi autori e altre incongruenze. In questi casi, il nome di una specie potrebbe essere il seguente:

cf. Andrographis paniculata (Burm.f.) Muro. ex Nees

  • cfr .: la specie non è stato determinato con certezza al 100%
  • Genere: Andrographis
  • Specie epitheton: Paniculata
  • Autore: (Burm.f.) Wall. ex Nees

o questo:

Ipomoea pes-caprae (L.) DC. subsp. brasiliensis (L.) Ooststr.f

  • Genere: Ipomea
  • Specie epitheton: pes-caprae
  • Specie autore: (L.) DC.
  • Subspecies epitheton: brasiliensis
  • Sottospecie Autore: (L.) Ooststr.f

Sto cercando di trovare un modo affidabile per decostruire tali nomi. Potrei scrivere qualche codice hacker usando tonnellate se/o dichiarazioni, ma sto cercando qualcosa di più elegante (e robusto). Stavo pensando ad una sorta di parser che analizza il nome in modo simile ad una calcolatrice che analizza un'espressione matematica. Sfortunatamente, non sono il programmatore più sofisticato e non ho mai scritto un vero parser in precedenza, né so se avrebbe senso in questo caso, dato che c'è una grande varietà di nomi scientifici. Quale pensi sia il modo migliore per affrontare questo problema? La lingua preferita è R, forse anche Julia se si adatta meglio al compito.

+6

Vorrei suggerire di NON provare a scrivere un parser per qualsiasi tipo di dati biologici, a meno che nessuno lo abbia mai fatto prima. Incontrerai così tanti casi limite, a cui non hai pensato quando hai progettato il parser. I biologi sono una specie strana :) Suggerirei di provare a trovare un parser adatto alle proprie esigenze e utilizzarlo invece di reinventare la ruota. – cel

+2

Dovresti trovare un elenco molto preciso di regole che un computer potrebbe seguire per analizzare queste espressioni. I tuoi tre esempi sembrano insufficienti per definire completamente come funzionerebbe l'analisi. Io come un essere umano farei fatica ad analizzare quelli. – MrFlick

risposta

15

Sei fortunato (tipo di). GBIF ha un name parser e gli hook del pacchetto taxize nella sua API con la funzione gbif_parse.

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. 

Vedere ?gbif_parse per ulteriori informazioni. È inoltre possibile trovare GBIF on github.

taxize sfrutta anche l'EOL API - vedere ?gni_parse.