Giter Site home page Giter Site logo

formatOcc() about plantr HOT 10 CLOSED

limaraf avatar limaraf commented on May 21, 2024
formatOcc()

from plantr.

Comments (10)

LimaRAF avatar LimaRAF commented on May 21, 2024

Olá @leilameyer08,

As funções que editam nomes de coletores e determinadores foram editadas recentemente. E na pressa de lançar uma nova versão do pacote, eu devo ter feito alguma bobagem em algum canto do código.

Te dou uma resposta até amanhã sobre isso.

Obrigado e desculpe novamente pelos erros no pacote.

from plantr.

LimaRAF avatar LimaRAF commented on May 21, 2024

Olá @leilameyer08,

Desculpe mas só agora cheguei em casa e pude olhar com calma o erro que vc estava tendo.

Obrigado novamente pelo test data e pela paciência com os bugs do plantR.

Como previ, era algo bem besta na função prepName que é usada internamente por formatOcc(). Tinha adicionado um passo de indexação para diminuir o tempo de processamento e tinha um typo na indexação do objeto. Isso quer dizer que os testes e exemplos rodavam sem erros, pois ele só apareceria com um vetor maior do que usamos nos testes e exemplos da função.

Fiz a correção e já subi para o master do pacote. Por favor, peço que vc re-installe o pacote direto do GitHub e tente novamente. E nos dê um feedback se deu "tudo certo".

O interessante é que exatamente o primeiro exemplo que vc tem nos seus dados é um caso típico de formato de nome que o plantR não lida bem: multiplos nomes coletores separados por vírgulas. Se você tiver certeza que todos os nomes nos seus dados usam esse formato, você pode usar os códigos abaixo para identificar esses coletores múltiplos. Mas se houverem nomes em outros formatos (e.g. Meyer, Leila), você transfere o problema para esses outros formatos de coletores múltiplos (veja o exemplo abaixo). Ou seja, enquanto não houver consenso entre a maneira de separar os coletores múltiplos, fica difícil oferecer uma solução única. Paracoletores únicos, esse problema não se aplica.

# Reading the example file given by the user
library (readr)
urlfile <- "https://raw.githubusercontent.com/leilameyer08/plantR/master/occs.exemplo.csv"
df <- as.data.frame(read_csv(url(urlfile)))

# Using the function
occs.all.2 <- formatOcc(df)

occs.all.2$recordedBy[1] ##"M. A. Costa, J. Ribeiro, P. A. Assunçao & E. C. Pereira"
occs.all.2$recordedBy.new[1] ## "Ackermann"

# An exemplo of 3 possible formats from your dataset (I edited them for clarity) 
exemplo <- c("M. A. Costa, J. Ribeiro & E. C. Pereira",
             "J. F. Morales Quirós; Michael H. Grayum ; Maria M. Chavarría",
             "Tiritan, O; Paiva, M")
# Setting commas as one of the possible separators for multiple names 
tmp.default <- fixName(exemplo) # using plantR default separators
tmp <- fixName(exemplo, 
               sep.in = c(";", "&", "|", " e ", " y ", " and ", " und ", " et ", 
                          ", ")) # here we add commas as a possible separator

#separating main and auxiliary names
tmp.aux.def <- prepName(tmp.default, fix.names = FALSE, sep.out = "; ", 
                        output = "aux")
tmp.new.def <- prepName(tmp.default, fix.names = FALSE, 
                        output = "first")
tmp.aux <- prepName(tmp, fix.names = FALSE, sep.out = "; ", 
                    output = "aux")
tmp.new <- prepName(tmp, fix.names = FALSE, 
                    output = "first")

# Inspecting the output
cbind(tmp.new.def, tmp.new, # main collector
      tmp.aux.def, tmp.aux) # other collectors

    tmp.new.def       tmp.new          tmp.aux.def                     tmp.aux                        
[1,] "M.a.costa, J.R." "Costa, M.A."    "Pereira, E.C."                 "Ribeiro, J.; Pereira, E.C."   
[2,] "Quiros, J.F.M."  "Quiros, J.F.M." "Grayum, M.H.; Chavarria, M.M." "Grayum, M.H.; Chavarria, M.M."
[3,] "Tiritan, O."     "Tiritan"        "Paiva, M."                     "O; Paiva; M"  

Isto é, adicionar a vírgula como separador resolve o primeiro exemplo de nome e "bagunça" o terceiro exemplo. Usar o default, "bagunça" o primeiro e resolve o terceiro.

from plantr.

leilameyer08 avatar leilameyer08 commented on May 21, 2024

Oi Renato,

Muito obrigada por toda atenção e por resolver os problemas tão rápido.
Desculpa a demora em responder, mas esse é um projeto paralelo e acabo dedicando menos tempo.

Rodei a função formatOcc() e está funcionando direitinho agora.

Nossa, muito obrigada por comentar sobre essa questão da vírgula como separador entre nomes de coletores/identificadores. Não tinha percebido esse problema. Tinha percebido que alguns nomes ficam padronizados de maneira estranha, mas não tinha olhado isso com calma ainda.

O nosso banco de dados tem todas os padrões possíveis nos nomes dos coletores e identificadores.
O pacote plantR ajuda demais na padronização (é incrível mesmo!!), mas não vai ser possível formatar todos os nomes por conta dessa bagunça que vem dos banco de dados.

Para os casos como: "M. A. Costa, J. Ribeiro, E. C. Pereira", pensei que uma opção seria deixar o default (não usar a vírgula como separador dos nomes). Mas antes de rodar a função formatOcc(), identificar quais strings tem "ponto" na segunda posição. Desses casos, idenficar quais tem vírgula e, então, substituir vírgula por ponto e vírgula. Assim:

occs.all <- as.data.frame(cbind(c(1,2,3), 
                                c("M. A. Costa, J. Ribeiro, E. C. Pereira",
                                  "M. A. Costa, J. Ribeiro & E.C. Pereira",
                                  "M. A. Costa; J. Ribeiro")))
colnames(occs.all) <- c("ID", "recordedBy")

pos.c2semic <- which(sapply(str_locate_all(pattern = "\\.", occs.all$recordedBy), function(x) (x[1])) == 2 &
                       !is.na(sapply(str_locate_all(pattern = "\\,", occs.all$recordedBy), function(x) (x[1]))))  
occs.all$recordedBy[pos.c2semic] <- str_replace_all(occs.all$recordedBy[pos.c2semic], "\\,", "\\;")

Também temos vários registros com padrão assim: "Costa M. A., Ribeiro J., E. C. Pereira". Nesses casos é bem difícil substituir as vírgulas corretamente.

Como precisamos dessa padronização dos nomes apenas para excluir registros duplicados, uma opção seria separar o nome do primeiro coletor antes de entrar na função formatOcc(). A busca por registros duplicados acaba usando o nome do primeiro coletor ou o sobrenome, então não teria muito problema. Vou testar isso.

Muito, muito obrigada!
Abraços

from plantr.

LimaRAF avatar LimaRAF commented on May 21, 2024

Oi @leilameyer08,

Obrigado você pelo retorno e pela paciência de continuar usando o pacote apesar de suas limitações ;)

A função formatOcc() é, na verdade, composta de outras funções executadas em série. Uma delas (fixName()), faz, entre outras coisas, exatamente essa padronização de separadores de nomes múltiplos. A idéia que vc deu poderia ser incorporada à fixName(), mas precisaríamos testar para ver se ele não inclui outros tipos de ruídos na padronização dos nomes. O exemplo que vc deu é bem pertinente. E já vi casos do tipo "Costa, M. A., Ribeiro J., E. C. Pereira" que complicam ainda mais a coisa toda. De qualquer forma, obrigado pela sugestão; ela pode ser o início de como encontrar uma saída. Mas dificilmente poderemos acomodar todos os casos, por isso a importância de se fazer um double-checking na saída das funções.

Estamos na fase de criar tutoriais e videos para ajudar os usuários a usar o plantR mesmo fora do workflow e dos wrappers, que simplificam bastante o processo, mas "escondem" detalhes que podem ser importantes em alguns casos. Dependendo da finalidade e uso final do banco de dados de vocês, podemos pensar em fazer um tutorial específico para ajudar a atingir os objetivos de vocês. Você está associada à alguma coleção biológica ou você é usuária final dos dados de várias coleções? Se seu objetivo for mesmo só a busca de duplicatas entre coleções, realmente os problemas não seriam tão importantes.

Vamos nos falando!

from plantr.

leilameyer08 avatar leilameyer08 commented on May 21, 2024

Oi @LimaRAF,

Eu que agradeço todo o apoio em resolver os problemas e também por vocês desenvolverem o pacote.
É incrível todas as padronizações, conferências e possibilidades que o pacote oferece. Está ajudando demais na construção do bancos de dados!
É importantíssimo memo essa conferência da saída das funções. O pacote ajuda demais nas padronizações, mas como existe uma complexidade de formatação nos dados originais, realmente não tem como incorporar todas as variações. Super entendo!
Nós criamos uma lista com padronização dos nomes de coletores mais frequentes e, depois de rodar a função, faço a substituição desses nomes de acordo com a nossa lista de nomes padronizados (por exemplo, substituindo "Acevedo-Rdgz., P." por "Acevedo-Rodriguez, P."). Também padronizamos os nomes dos identificadores especialistas da família (Ferrucci, M.S., Medeiros, H., Acevedo-Rodriguez, P., Somner, G.V. e Radlkofer, L.A.T.).

Estamos construindo um banco de dados de ocorrência para as espécies da tribo Paullinieae. Depois usaremos o banco para avaliar padrões de diversidade dessas lianas.
Eu, Herison Medeiros e Annelise Frazão estamos liderando essa fase inicial de construção do banco, mas outros especialistas na tribo (Pedro Acevedo, Genise Somner e María Silvia Ferrucci) e a Rafaela Forzza (que é orientadora do doutorado do Herison) também colaboram no projeto.
Inicialmente o banco será usado em um capítulo da tese do Herison para descrever padrões de riqueza e endêmismo da tribo. Mas depois pretendemos explorar mais coisas e, quem sabe, ir incluíndo as lianas de outros grupos nessas avaliações de padrões de diversidade.
Sobre a construção do banco, estamos usando os dados do GBIF, speciesLink e BIEN, fazendo as padronizações e limpezas automáticas pelo plantR e, depois, os especialistas vão fazer uma validação visual dos pontos de ocorrência de cada espécie (excluir pontos fora da distribuição, por exemplo).

Esses tutoriais e vídeos vão ajudar muito mesmo. Seria ótimo se tiver algum tutorial usando os dados da tribo Paullinieae.
Vamos conversando e muito obrigada!

from plantr.

leilameyer08 avatar leilameyer08 commented on May 21, 2024

@LimaRAF,
Aproveitando que estamos falando da função formatOcc() (e das outras funções por trás), tem alguns registros com dados fora do padrão e que preciso formatar para que a função formatOcc() rode.

Os casos são:

  • registros com recordNumber =="938[=Diary No. 707]"
  • registros com verbatimEventDate == "Sept. 4-'77" ou "label says "1841/XIV""
  • registros com recordedBy == "M. Nadruz; ,J.F. Baumgratz, M. Bovini, D.S.P. Silva"

Isso não é um problema porque formatando essas células já resolve. É mais para reportar esses casos.
Vou deixar o código aqui (deixei o exemplo baixando apenas parte dos dados da tribo Paullinieae para não demorar tanto):

### Clean the environment ####
rm(list=ls())



### Installation ####
if(!require("remotes")) install.packages("remotes")
if(!require("plantR")) remotes::install_github("LimaRAF/plantR")
if(!require("BIEN")) install.packages("BIEN")
if(!require("rgbif")) install.packages("rgbif")
if(!require("stringr")) install.packages("stringr")




### Download occurrence data ####


#### Download occurrence data from BIEN ####
occ.BIEN <- BIEN_occurrence_genus(genus = c("Lophostigma",
                                            "Thinouia",
                                            "Urvillea"),
                                  cultivated = F,
                                  only.new.world = F,
                                  all.taxonomy = F,
                                  native.status = F,
                                  natives.only = T,
                                  observation.type = T,
                                  political.boundaries = T,
                                  collection.info = T) 

dim(occ.BIEN) # 2033  24


## Standardization of character encoding
for (i in 1:ncol(occ.BIEN)){
  if(is.character(occ.BIEN[,i])){
    Encoding(occ.BIEN[,i]) <- "UTF-8"
  }
}



### Download occurrence data from speciesLink ####
occ.splink <- rspeciesLink(basisOfRecord = "PreservedSpecimen",
                           family = "Sapindaceae",
                           species = c("Lophostigma",
                                       "Thinouia",
                                       "Urvillea"),
                           Scope = "plants",
                           Synonyms = "species2000",
                           MaxRecords = 300000)

dim(occ.splink) # 3912    49


## Standardization of character encoding
c.right <- c("À", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", 
             "Ì", "Î", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", 
             "Ù", "Ú", "Û", "Ü", "Þ", "ß", "á", "â", "ã", "ä", "å", 
             "æ", "ç", "è", "é", "ê", "ë", "ì", "î", "ï", "ð", "ñ", "ò", 
             "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ", "í")

c.wrong <- c("À", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", 
             "Ê", "Ë", "Ì", "Î", "Ñ", "Ò", "Ó", "Ô", 
             "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Þ", "ß", 
             "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", 
             "ë", "ì", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", 
             "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ", "Ã.")


for (i in 1:ncol(occ.splink)){
  if(is.character(occ.splink[,i])){
    Encoding(occ.splink[,i]) <- "UTF-8"
    
    for(j in 1:length(c.right)){
      occ.splink[,i] <- str_replace_all(occ.splink[,i], 
                                        pattern = c.wrong[j], 
                                        replacement = c.right[j])
    }
  }
}



### Download occurrence data from GBIF ####
occ.gbif <- rgbif2(dir = "data/plantR",
                   filename = "output.gbif",
                   species = c("Paullinia rubiginosa Cambess.",
                               "Paullinia fuscescens Kunth",
                               "Cardiospermum halicacabum L.",
                               "Serjania erecta Radlk.",
                               "Lophostigma Radlk.",
                               "Thinouia Triana & Planch.",
                               "Urvillea Kunth"),
                   n.records = 300000,
                   force = T,
                   basisOfRecord = "PRESERVED_SPECIMEN")

dim(occ.gbif) # 18680  179


## Standardization of character encoding
for (i in 1:ncol(occ.gbif)){
  if(is.character(occ.gbif[,i])){
    Encoding(occ.gbif[,i]) <- "UTF-8"
  }
}





### Combine different databases ####


### Formatting BIEN database before running the formatDwc() fuction ####

## Separate "date_collected" into year, month and day
occ.BIEN[,25] <- sapply(strsplit(as.character(occ.BIEN$date_collected), "-"), function(x) (x[1]))
occ.BIEN[,26] <- sapply(strsplit(as.character(occ.BIEN$date_collected), "-"), function(x) (x[2]))
occ.BIEN[,27] <- sapply(strsplit(as.character(occ.BIEN$date_collected), "-"), function(x) (x[3]))
colnames(occ.BIEN)[25:27] <- c("year", "month", "day")



## Prepare other required columns
occ.BIEN[,28] <- occ.BIEN$county
occ.BIEN[,29:30] <- NA
occ.BIEN[,31] <- "Sapindaceae"
colnames(occ.BIEN)[28:31] <- c("municipality", "typeStatus", "scientificNameAuthorship", "family")


## Standardize column names
colnames(occ.BIEN)[colnames(occ.BIEN) == "collection_code"] <- "collectionCode"
colnames(occ.BIEN)[colnames(occ.BIEN) == "catalog_number"] <- "catalogNumber"
colnames(occ.BIEN)[colnames(occ.BIEN) == "record_number"] <- "recordNumber"
colnames(occ.BIEN)[colnames(occ.BIEN) == "recorded_by"] <- "recordedBy"
colnames(occ.BIEN)[colnames(occ.BIEN) == "state_province"] <- "stateProvince"
colnames(occ.BIEN)[colnames(occ.BIEN) == "latitude"] <- "decimalLatitude"
colnames(occ.BIEN)[colnames(occ.BIEN) == "longitude"] <- "decimalLongitude"
colnames(occ.BIEN)[colnames(occ.BIEN) == "identified_by"] <- "identifiedBy"
colnames(occ.BIEN)[colnames(occ.BIEN) == "date_identified"] <- "dateIdentified"
colnames(occ.BIEN)[colnames(occ.BIEN) == "scrubbed_species_binomial"] <- "scientificName"
colnames(occ.BIEN)[colnames(occ.BIEN) == "custodial_institution_codes"] <- "institutionCode"
colnames(occ.BIEN)[colnames(occ.BIEN) == "X.U.FEFF.scrubbed_genus"] <- "scrubbed_genus"

occ.BIEN$dateIdentified <- as.character(occ.BIEN$dateIdentified)



### Combine database using formatDwc() function ####
occs.all <- formatDwc(user_data = occ.BIEN, 
                      splink_data = occ.splink,
                      gbif_data = occ.gbif, 
                      drop = T, bind_data = T)

dim(occs.all) # 24625  records




### Data editing ####

#### Collection codes, people names, collector number and dates ####


## Formatting strings before running formatOcc() fuction to avoid this error:
# Error in gsub(x, "", y, fixed = TRUE) : zero-length pattern
occs.all$recordNumber[which(occs.all$recordNumber == "938[=Diary No. 707]")] <- NA
occs.all$verbatimEventDate[which(occs.all$verbatimEventDate == "Sept. 4-'77")] <- NA
occs.all$verbatimEventDate[which(occs.all$verbatimEventDate == "label says \"1841/XIV\"")] <- NA
occs.all$recordedBy[which(occs.all$recordedBy == "M. Nadruz; ,J.F. Baumgratz, M. Bovini, D.S.P. Silva")] <- "M. Nadruz, J.F. Baumgratz, M. Bovini, D.S.P. Silva"



## Replacing "," by ";" to separete names of collectors and identifiers
## Caso 1: "M. A. Costa, J. Ribeiro, E. C. Pereira"

## recordedBy
pos.c2semic <- which(sapply(str_locate_all(pattern = "\\.", occs.all$recordedBy), function(x) (x[1])) == 2 &
                       !is.na(sapply(str_locate_all(pattern = "\\,", occs.all$recordedBy), function(x) (x[1]))))

occs.all$recordedBy[pos.c2semic] <- str_replace_all(occs.all$recordedBy[pos.c2semic], "\\,", "\\;")


## identifiedBy
pos.c2semic.I <- which(sapply(str_locate_all(pattern = "\\.", occs.all$identifiedBy), function(x) (x[1])) == 2 &
                         !is.na(sapply(str_locate_all(pattern = "\\,", occs.all$identifiedBy), function(x) (x[1]))))

occs.all$identifiedBy[pos.c2semic.I] <- str_replace_all(occs.all$identifiedBy[pos.c2semic.I], "\\,", "\\;")



### Replacing "|" by " | " 
## Caso 2: "M. A. Costa|J. Ribeiro|E. C. Pereira"
occs.all$recordedBy <- str_replace_all(occs.all$recordedBy, "\\|", " | ")
occs.all$identifiedBy <- str_replace_all(occs.all$identifiedBy, "\\|", " | ")



occs.all.2 <- formatOcc(occs.all)

from plantr.

LimaRAF avatar LimaRAF commented on May 21, 2024

Olá @leilameyer08

Estou trabalhando entre hoje e amanhã para tentar incorporar esses casos excepcionais que vc mencionou e para resolver o issue #79. Vou te avisando assim que for resolvendo.

Um tutorial específico para a tribo Paullinieae é uma boa idéia mas talvez demore mais. Vou tentar, mas como o tempo é corrido, não garanto que consiga.

from plantr.

LimaRAF avatar LimaRAF commented on May 21, 2024

Olá @leilameyer08 (c/c @AndreaSanchezTapia @saramortara),

Trabalhei nesses últimos dias nos códigos tentando isolar or problemas que vc encontrou e fazer algumas melhorias que julguei serem necessárias.

Incorporei alguns dos casos excepcionais que você mencionou entre os passos que editam os campos "recordNumber", "EventDate", e os nomes de pessoas (i.e. "recordedBy" e "identifiedBy"). Também inclui como um argumento da função fixName() (que é usada internamente por formatOcc() para padronizar a separação entre coletores múltiplos) a possiblidade de isolar e corrigir o uso vírgula como separador dos nomes de coletores múltiplos (argumento 'bad.comma') para o caso específico que vc mencionou (estou estudando a possibilidade de lidar com outros casos do tipo). No final das contas, não consegui mais reproduzir o erro que vc estava tendo em 'formatOcc()'. Por favor, veja se você consegue ainda reproduzí-lo.

Além disso decidir colocar o BIEN como uma fonte de ocorrência padrão dentro de formatDwc (novo argumento 'bien_data'. Foi mais complicado do que pensei, pois o BIEN nem sempre retorna as mesmas colunas, dependendo da função usada para baixar os registros, e porque não é fácil fazer a equivalencia de vários dos campos deles para os DWC standards. E eles tb usam um formato de data diferente do GBIF, que tem que ser alterado antes do bind_data. Bom, não sei se o BIEN não deve ir se tornando obsoleto como fonte de informações (no seu caso 99% dos registros estão no GBIF ou speciesLink ou em ambos), mas agora temos essa opção.

Por último, formatDwc agora tem a opção de corrigir problemas de econding que vc estava fazendo por fora. Cheguei a tentar usar uma solução já existente (i.e. stringr::str_conv()), mas ela não resolve strings com encoding misturados. Então criei uma função específica pra converter problemas comuns de encoding para texto em 'latin1' (não é muito veloz, mas resolve o problema). No default de formatDwc, contudo, essa correção não é feita; vc precisa especificar quais dados de entrada vc quer transformar (veja códigos abaixo).

Como resultado, a formatDwc() ficou um pouco mais lenta dada a conversão dos problemas de encoding. Seu código, pelo menos, ficou bem mais enxuto agora (ver exemplo abaixo). Mas, veja por favor se o erro persiste ou não na sua máquina e nos dê um retorno quando puder. Ainda não subi as modificações para o repositório do git, mas farei ainda hoje ou amanhã, assim que ver o novo issue que você postou.

### Installation ####
if(!require("remotes")) install.packages("remotes")
if(!require("plantR")) remotes::install_github("LimaRAF/plantR", ref = "dev") # should install directly from the development branch
if(!require("BIEN")) install.packages("BIEN")
if(!require("rgbif")) install.packages("rgbif")
if(!require("stringr")) install.packages("stringr")

#### Download occurrence data from BIEN ####
occ.BIEN <- BIEN_occurrence_genus(genus = c("Cardiospermum",
                                            "Lophostigma",
                                            "Paullinia",
                                            "Serjania",
                                            "Thinouia",
                                            "Urvillea"),
                                  cultivated = F,
                                  only.new.world = F,
                                  all.taxonomy = F,
                                  native.status = F,
                                  natives.only = T,
                                  observation.type = T,
                                  political.boundaries = T,
                                  collection.info = T)
dim(occ.BIEN) # 33415   24
table(occ.BIEN$scrubbed_genus)

### Download occurrence data from speciesLink ####
occ.splink <- rspeciesLink(basisOfRecord = "PreservedSpecimen",
                           family = "Sapindaceae",
                           species = c("Cardiospermum",
                                       "Lophostigma",
                                       "Paullinia",
                                       "Serjania",
                                       "Thinouia",
                                       "Urvillea"),
                           Scope = "plants",
                           Synonyms = "species2000",
                           MaxRecords = 300000)

dim(occ.splink) # 62295    49
table(occ.splink$genus)

### Download occurrence data from GBIF ####
occ.gbif <- rgbif2(dir = "data/plantR",
                   filename = "output.gbif",
                   species = c("Thinouia Triana & Planch.",
                               "Lophostigma Radlk.",
                               "Cardiospermum L.",
                               "Paullinia L.",
                               "Serjania Mill.",
                               "Urvillea Kunth"),
                   n.records = 300000,
                   force = T,
                   basisOfRecord = "PRESERVED_SPECIMEN")

dim(occ.gbif) # 134570    206
table(occ.gbif$genus)

### Combine database using formatDwc() function ####
occs.all <- formatDwc(
  splink_data = occ.splink,
  gbif_data = occ.gbif,
  bien_data = occ.BIEN,
  fix.encoding = c("splink_data", "gbif_data", "bien_data"),
  drop = T, bind_data = T)

dim(occs.all) # 230280     47  records

### Data editing ####

#### Collection codes, people names, collector number and dates ####
occs.all.2 <- formatOcc(occs.all)

##### Inspecting the results and changes
patt <- "M. A. Costa," #ok
head(cbind(occs.all.2$recordedBy[grepl(patt, occs.all.2$recordedBy)],
      occs.all.2$recordedBy.new[grepl(patt, occs.all.2$recordedBy)],
      occs.all.2$recordedBy.aux[grepl(patt, occs.all.2$recordedBy)]), 3)

patt <- "M. Nadruz; ,J.F." #
cbind(occs.all.2$recordedBy[grepl(patt, occs.all.2$recordedBy)],
      occs.all.2$recordedBy.new[grepl(patt, occs.all.2$recordedBy)],
      occs.all.2$recordedBy.aux[grepl(patt, occs.all.2$recordedBy)])

patt <- "Diary" #return most ok
cbind(occs.all.2$recordNumber[grepl(patt, occs.all.2$recordNumber)],
      occs.all.2$recordNumber.new[grepl(patt, occs.all.2$recordNumber)])

patt <- "Sept. 4-'77" #ok
cbind(occs.all.2$verbatimEventDate[grepl(patt, occs.all.2$verbatimEventDate, fixed = TRUE)],
      occs.all.2$year.new[grepl(patt, occs.all.2$verbatimEventDate, fixed = TRUE)])

patt <- "label says" #ok
cbind(occs.all.2$verbatimEventDate[grepl(patt, occs.all.2$verbatimEventDate, fixed = TRUE)],
      occs.all.2$year.new[grepl(patt, occs.all.2$verbatimEventDate, fixed = TRUE)])

patt <- "R. P. Bel" #Encoding
table(occ.splink$recordedBy[grepl(patt, occ.splink$recordedBy)])
table(occ.gbif$recordedBy[grepl(patt, occ.gbif$recordedBy)])
table(occ.BIEN$recorded_by[grepl(patt, occ.BIEN$recorded_by)])
table(occs.all$data_source[grepl(patt, occs.all$recordedBy)],
      occs.all$recordedBy[grepl(patt, occs.all$recordedBy)])
#Encoding after name editing
table(occs.all.2$data_source[grepl(patt, occs.all.2$recordedBy)],
      occs.all.2$recordedBy.new[grepl(patt, occs.all.2$recordedBy)])

from plantr.

leilameyer08 avatar leilameyer08 commented on May 21, 2024

Oi @LimaRAF,

As mudanças ficaram ótimas!
A formatOcc() não deu mais erro. Testei todas as funções até a validateDup() e estão todas funcionado.

Conferi o nome dos coletores separados por vírgula ou por barra sem espaço, e a função está padronização direitinho. Maravilha!!
Ficou ótimo a inclusão dos dados do BIEN diretamente na função formatDwc (apesar do trabalhão que deu).
Ótima essa possibilidade de corrigir o econding dentro da função formatDwc().

Ficou excelente mesmo!! Não sei nem como agradecer!
Muitíssimo obrigada! ;)

from plantr.

LimaRAF avatar LimaRAF commented on May 21, 2024

Que bom @leilameyer08 ! Ficamos felizes que o plantR será útil pro trabalho de vcs. Fechando a issue então...

from plantr.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.