10.1 Dados categóricos

A lógica básica é simples. Para cada tipo de informação (variável), buscaremos por um conjunto de palavras e suas variantes, e substituiermos todas elas por uma única palavra, criando estados de variação (categorias). É importante pensar na ordem em que a busca é feita, pois em algumas notas descritivas duas palavras podem ser encontradas e você quer apenas uma delas. Por exemplo, na busca por hábito você deveria buscar a palavra epífita antes da palavra árvore, porque se a coleta for de uma planta epífita, a palavra árvore pode aparecer como hospedeiro. Não precisa se preocupar com acentos nem se a palavra está em caixa alta ou baixa. Criaremos uma função para ignorar isso nas comparações.

10.1.1 Passo 01 - Lista de referência

Você cria uma lista de referencia (veja a seção 10.2 para exemplos de listas de referência) para cada variável que quer buscar, composta de vetores com palavras ou parte de palavras a serem buscadas. Cada vetor tem um nome, que é a palavra que define a categoria (estados de variação da variável). A construção dessa lista deve ser baseada nas palavras que existem nos seus dados. As listas de referência abaixo contêm alguns conjuntos de palavras que você pode ajustar para seu uso. Vamos tomar como exemplo a variável hábito. Teremos duas categorias que desejamos separar: arvoreta e árvore. Vamos primeiro criar uma lista de referência usando a construção obj[[nome.da.categoria]] = c(palavras.a.buscar).

referencias <- list()
referencias[["arvoreta"]] <- c("arvoreta", "treelet", "arvore pequena", "arbolito", "small tree")
referencias[["árvore"]] <- c("arvore", "tree", "rvore", "arvo", "arbol", "avore")
referencias
## $arvoreta
## [1] "arvoreta"       "treelet"        "arvore pequena" "arbolito"      
## [5] "small tree"    
## 
## $árvore
## [1] "arvore" "tree"   "rvore"  "arvo"   "arbol"  "avore"

Vejam que em nossa lista de referência referencias incluímos primeiramente arvoreta e depois árvore, porque árvore faz parte da palavra arvoreta, e nós desejamos diferenciar as duas categorias. Note que erros de grafia e palavras em diferentes idiomas podem ser inseridos nesses vetores como palavras a serem buscadas.

10.1.2 Passo 02 - Funções que fazem a busca

Primeiro criaremos uma função removeacentos(), que pega um texto ou vetor de textos e remove acentos. Isso é útil porque é frequente a mesma palavra aparecer com e sem acentos, por isso é melhor ignorar acentos nas comparações.

removeacentos <- function(x) {
  # remove acentos
  xx <- iconv(x, to = "ASCII//TRANSLIT")
  xx <- gsub("[~|^|~|\"|'|`]", "", xx)
  return(xx)
}

E uma segunda função pegavalor()que usa a lista de referência para extrair os dados de um texto. Nesta função, o argumento x é um vetor de classe character de comprimento igual a 1 contendo o texto original a ser explorado. O segundo argumento da função, referencias, é uma lista de comprimento maior ou igual a 1 referente as categorias a serem buscadas no elemento x:

pegavalor <- function(x, referencias) {
  acategoria <- NA # objeto onde armazena a categoria caso encontre em x
  x <- x[!is.na(x)] # elimina elementos NA em x
  x <- removeacentos(x)
  if (length(x) == 1 & is.character(x)[1]) { # se x ainda for um texto
    for (t in 1:length(referencias)) {
      # se ainda não encontrou procura em outra referencia
      if (is.na(acategoria)) {
        words <- referencias[[t]] # pega as palavras a serem buscadas
        words <- words[!is.na(words)] # limpa caso haja NAs
        hab <- names(referencias)[t] # pega a categoria correspondente
        if (!is.null(hab) & !is.na(hab) & length(words) >= 1) {
          words <- removeacentos(words)
          found <- 0
          # para cada palavra chave busca em x e se encontrar anota
          for (g in 1:length(words)) {
            gp <- grep(words[g], x, ignore.case = T)
            if (length(gp) > 0) {
              found <- found + 1
            }
          }
          # se encontrou, atribui
          if (found > 0) {
            acategoria <- hab
          }
        }
      }
    }
  }
  # retorna o resultado
  return(acategoria)
}

10.1.3 Passo 03 - Usando a função

Vamos utilizar dados de exemplo para testar a função. Baixe o arquivo presente neste endereço (https://github.com/LABOTAM/IntroR/blob/main/dados/pegados_dados_exemplo.csv). Ele apresenta uma coluna com notas de exsicatas para ilustrar nosso exemplo.

# voce já deve ter os seguinte objetos: pegavalor(), removeacentos(), referencias
# le o arquivo de exemplo
dados <- read.table(file = "pegados_dados_exemplo.csv", sep = "\t", as.is = TRUE, na.strings = c("NA", "NULL", ""), header = TRUE)
txt.org <- dados$NOTAS_ORIGINAL # coluna com dados de notas (cada linha é um registro)
head(txt.org)
## [1] "; HABITAT: Floresta Ombrófila Densa Submontana.; DESC: Árvore de 12m; frutos imaturos verdes. árvore de 12m; frutos imaturos verdes;HABITAT: Floresta Ombrófila Densa Submontana.; DESC: Árvore de 12m; frutos imaturos verdes."                                                  
## [2] "; Hábito: Árvore; Cor da flor: ; Cor do fruto: verdes árvore de 8 m de altura, frutos verdes. árvore de 8m altura, frutos verdes.;Árvore de 8 m de altura, frutos verdes."                                                                                                        
## [3] "; Hábito: Árvore; Cor da flor: brancas (botoes brancos); Cor do fruto: árvore de 10 m de altura, botoes e flores brancos. árvore de 10 m de altura, botões e flores brancos. árvore de 10m de altura, botoes e flores brancos.;Árvore de 10 m de altura, botões e flores brancos."
## [4] "?muena?, 15m, fls. Yellow"                                                                                                                                                                                                                                                        
## [5] "[BARCODE = *MIRR 00705*]Tall terra firme forest with trees to 35m; Transecto de tatu, c. 4km from station.&nf;&nf;Tree, 20cm dbh.&nf;Vegetative ecological voucher."                                                                                                              
## [6] "10m x 15cm DAP. Frutos imaturos verdes. 10m x 15cm dap. frutos imaturos verdes. ; de árvore de 10m x 15 cm dap, frutos imaturos verdes"
habito <- sapply(txt.org, pegavalor, referencias = referencias)
table(habito) # o que estiver NA significa que ele não encontrou as palavras em referencias.
árvore arvoreta
542 113
# adiciona com uma nova coluna em dados
dados$HABITO <- habito