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)
.
<- list()
referencias "arvoreta"]] <- c("arvoreta", "treelet", "arvore pequena", "arbolito", "small tree")
referencias[["árvore"]] <- c("arvore", "tree", "rvore", "arvo", "arbol", "avore")
referencias[[ 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.
<- function(x) {
removeacentos # remove acentos
<- iconv(x, to = "ASCII//TRANSLIT")
xx <- gsub("[~|^|~|\"|'|`]", "", xx)
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
:
<- function(x, referencias) {
pegavalor <- NA # objeto onde armazena a categoria caso encontre em x
acategoria <- x[!is.na(x)] # elimina elementos NA em x
x <- removeacentos(x)
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)) {
<- referencias[[t]] # pega as palavras a serem buscadas
words <- words[!is.na(words)] # limpa caso haja NAs
words <- names(referencias)[t] # pega a categoria correspondente
hab if (!is.null(hab) & !is.na(hab) & length(words) >= 1) {
<- removeacentos(words)
words <- 0
found # para cada palavra chave busca em x e se encontrar anota
for (g in 1:length(words)) {
<- grep(words[g], x, ignore.case = T)
gp if (length(gp) > 0) {
<- found + 1
found
}
}# se encontrou, atribui
if (found > 0) {
<- hab
acategoria
}
}
}
}
}# 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
<- read.table(file = "pegados_dados_exemplo.csv", sep = "\t", as.is = TRUE, na.strings = c("NA", "NULL", ""), header = TRUE) dados
<- dados$NOTAS_ORIGINAL # coluna com dados de notas (cada linha é um registro)
txt.org 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"
<- sapply(txt.org, pegavalor, referencias = referencias)
habito 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
$HABITO <- habito dados