Arrumando BDs: nome das variáveis

Por William 12/07/2017

Arrumar base de dados é uma tarefa chata, perigosa e pode consumir uma grande parcela do tempo total do projeto.

A tarefa é chata porque é um grande retrabalho que muitas vezes cai na mão dos estatísticos. Mandar de volta para o responsável corrigir é uma opção, mas já passei por situações em que o tempo perdido no vai-e-vem da bd foi bem maior do que o tempo que eu gastaria para arrumar eu mesmo (e no fim, o banco ainda continha erros). Bds apropriadas para a análise poderiam (e deveriam) ser montados pelo pesquisador ou responsável desde o início, pois, em geral, são bem mais simples do que as que costumamos receber. Por isso, sempre vale espalhar as boas práticas de construção de bds na hora de pegar um trabalho.

É uma tarefa perigosa porque mexer nos dados é sempre uma fonte de erro, principalmente quando fazemos alterações diretamente na planilha e/ou não temos conhecimento técnico sobre as variáveis.

Por fim, se a base é muito grande e tem muitos erros, precisamos encontrar formas eficientes para corrigi-la, pois mexer em variável por variável, se não for inviável, pode demandar muito tempo.

Sendo assim, vamos começar aqui uma pequena série de posts para ajudar nessa tarefa, utilizando sempre as ferramentas do tidyverse, em especial do pacote stringr. Neste post, começarei mostrando uma forma rápida para padronizar os nomes das variáveis da bd, deixando-os mais adequados para o restante da análise.

Para isso, vou utilizar como exemplo algumas variáveis de uma base com que trabalhei alguns anos atrás. A bd original (que continha informações de pacientes do Instituto do Coração) tinha cerca 170 variáveis, então selecionei apenas algumas.

library(tidyverse)

dados %>% names
##  [1] "Sexo"                 "Nascimento"           "Idade"               
##  [4] "Inclusão"             "Cor"                  "Peso"                
##  [7] "Altura"               "cintura"              "IMC"                 
## [10] "Superfície corporal"  "Tabagismo"            "cg.tabag (cig/dia)"  
## [13] "Alcool (dose/semana)" "Drogas ilícitas"      "Cafeína/dia"         
## [16] "Refrig/dia"           "Sedentario"           "ativ. Fisica"

Vejam que os nomes têm letras maiúsculas, acentos, parênteses, pontos e barras. Não é impossível fazer a análise com esses nomes, mas geralmente atrapalha bastante quando precisamos selecionar algumas dessas colunas. O ideal seria ter os nomes padronizados, até para ficar mais fácil de lembrarmos deles.

Para deixar o exemplo reprodutível sem a necessidade de baixar a bd, gerei o código para criar um vetor com o nome das variáveis.

dados %>% 
  names %>% 
  paste0("'", ., "'",  collapse = ", ") %>% 
  paste0("c(", ., ")")
## [1] "c('Sexo', 'Nascimento', 'Idade', 'Inclusão', 'Cor', 'Peso', 'Altura', 'cintura', 'IMC', 'Superfície corporal', 'Tabagismo', 'cg.tabag (cig/dia)', 'Alcool (dose/semana)', 'Drogas ilícitas', 'Cafeína/dia', 'Refrig/dia', 'Sedentario', 'ativ. Fisica')"

Para padronizar os nomes (todos ao mesmo tempo), utilizei o código abaixo. Se você não está familiarizado com as expressões regulares (regex), temos um pequeno tuturial no material do nosso curso. Veja o que cada linha faz.

  • stringr::str_trim(): remove espaços do começo e do final. Não tinha nenhum caso neste exemplo, mas é sempre bom garantir.
  • stringr::str_to_lower(): transforma letras maiúsculas em minúsculas.
  • abjutils::rm_accent(): remove os acentos das palavras.
  • stringr::str_replace_all("[/' '.()]", "_"): substitui barras, espaços e parênteses por subtraço _.
  • stringr::str_replace_all("_+", "_"): substitui um ou mais subtraços juntos por apenas um subtraço.
  • stringr::str_replace("_$", ""): remove os subtraços no final dos nomes.
nomes <- dados %>%
  names %>% 
  stringr::str_trim() %>% 
  stringr::str_to_lower() %>% 
  abjutils::rm_accent() %>% 
  stringr::str_replace_all("[/' '.()]", "_") %>% 
  stringr::str_replace_all("_+", "_") %>% 
  stringr::str_replace("_$", "")

nomes
##  [1] "sexo"                "nascimento"          "idade"              
##  [4] "inclusao"            "cor"                 "peso"               
##  [7] "altura"              "cintura"             "imc"                
## [10] "superficie_corporal" "tabagismo"           "cg_tabag_cig_dia"   
## [13] "alcool_dose_semana"  "drogas_ilicitas"     "cafeina_dia"        
## [16] "refrig_dia"          "sedentario"          "ativ_fisica"

Agora basta atribuir os nomes de volta aos dados.

names(dados) <- nomes

Claro que o código utilizado funciona bem para esse exemplo. Se os nomes tivessem outros problemas, precisaríamos acrescentar mais linhas contendo outras mudanças. No entanto, essas alterações já resolvem a maioria dos casos mais comuns e é bem fácil modificar o código para lidar com outros problemas.

Dúvidas, críticas ou sugestões, deixe um comentário ou nos envie uma mensagem. :)

comments powered by Disqus