Análise de Dados em R (FNDE) - Módulo 1

Sessão 6 - Leitura, Escrita e Manipulação de Dados

Allan Vieira
janeiro de 2018

Objetivos desta Sessão


  • Conhecer as formas básicas de leitura de dados externos ao R;

  • Aprender técnicas básicas de manipulação de dados no R;

  • Aprender técnicas básicas de escrita de dados em arquivos externos ao R;

Introdução



  • nem sempre os dados estão da forma como desejamos;

  • 90% do trabalho da análise de dados é preparar os dados;

  • assim como no caso dos gráficos, o R possui dezenas de pacotes para leitura e escrita de dados – uns focam em rapidez, outros na praticidade e outros no tamanho dos dados a serem lidos;

Leitura de Dados



  • Na maioria das vezes que fizermos uma leitura de dados no R, ele tentará carregá-los como um dataframe;

  • Lembre-se de que você sempre poderá confirmar o tipo de objeto resultante da leitura com as funções str() ou class().

Função scan() (1)

  • Um dos melhores usos para a função scan() é a leitura de dados por meio de Ctrl+C / Ctrl+V;

  • Pode ser muito útil em situações com tabelas de um único tipo, pequenas e que estão em arquivos do word, uma página da internet ou até mesmo num .PDF (OCR, não imagens)

  • Função scan() é limitada e serve mais como um “quebra galho” quando queremos ler poucos dados rapidamente;

  • OBS: alguns parâmetros de entrada de dados podem ser controlados, como o separador decimal com sep=“,” ou sep=“.”;
  • Leia os dados da seguinte tabela com a função scan() ( out <- scan() ):
    10 34 22 21
    2 34 109 3
    23 10 67 88
    45 88 1 1
    0 291 38 92

Função scan() (2)

  • Note que a função scan() lerá seus dados como um único vetor (Verifique com str(out)) ! Cabe a você separá-los da forma correta.

  • Se quiser transformá-los em um data.frame, jogue primeiro para uma matriz (usando o parâmetro byrow=TRUE) e depois force-os como dataframe, utilizando as.data.frame():

out_df <- as.data.frame(matrix(out, ncol=4, byrow=TRUE))

Função readLines()



  • Assim como scan(), readLines é uma função bastante básica do R e não deve ser utilizada quando temos dados já estruturados;

  • No entanto, pode ser bastante útil quando desejamos ler todas as informações de um arquivo (.txt por exemplo) para trabalhar posteriormente com expressões regulares;

  • Verifique mais sobre esta função depois com help(readLines).

Funções da família read.table() (1)



  • As funções da família read.table() são as que você mais irá utilizar (inicialmente) para leitura de dados externos ao R;

  • read.table() é uma função genérica com a qual você poderá ler principalmente arquivos .txt e .csv;

  • Verifique o help() de read.table()!

  • Há vários parâmetros que podem ser passados a ela, mas 5 são extremamente importantes de serem observados:

    • 1. localização do arquivo;
    • 2. existência ou não de cabeçalho nos dados;
    • 3. forma de separação das colunas;
    • 4. forma de especificação da casa decimal nos dados;
    • 5. stringsAsFactors.

Funções da família read.table() (2)

  • 1. Localização do arquivo - parâmetro file:
#informar a localização correta do arquivo em seu computador;
#lembrar de usar barra invertida dupla no Windows:
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt")
  • 2. Os dados possuem cabeçalho? - parâmetro header:
    • caso POSITIVO:
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt", header=TRUE)
  • caso NEGATIVO:
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt", header=FALSE)
  • 3. Como estão separadas as colunas? - parâmetro sep:
    • por vírgula:
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt", ... , sep=",")
  • por ponto e vírgula:
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt", ..., sep=";")
  • por espaço:
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt", ..., sep=" ")
  • por TAB:
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt", ..., sep="\t")

Funções da família read.table() (3)

  • 4. Qual a especificação decimal para seus dados numéricos? parâmetro dec:
    • caso seja “,” (padrão brasileiro):
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt", ..., dec=",")
  • caso seja “.” (padrão anglo saxão):
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt", ..., dec=".")
  • Após serem lidos no R, o tratamento para a casa decimal sempre passará a ser o ponto “.” !!
  • 5. parâmetro stringsAsFactors:
    • O parâmetro stringsAsFActors indica como você quer ler as colunas de strings: como variáveis qualitativas categóricas/ fatores; ou como caracteres apenas.
    • O mais recomedado é passas stringsAsFactors=FALSE sempre
df <- read.table(  file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt", ... , stringsAsFactors=FALSE)
  • Caso haja alguma coluna nos seus dados que deva ser tratada como variável qualitativa categórica, você poderá modificá-la postriormente com as.factor(nome_da_variavel).

Funções da família read.table() (4)

  • Com read.table(), você pode ler qualquer arquivo de qualquer extensão desde que esteja organizado em uma das formas descritas anteriormente e desde que você especifique corretamente os parâmetros;

  • Você pode por exemplo ter um arquivo .dat que consegue abrir no bloco de notas para identificar como deve passar os parâmetros no R;

  • Como na maioria das vezes, estamos lidando com arquivos do tipo .txt ou .csv separados por TAB, vírgula ou ponto e vírgula, o R já traz quatro funções específicas para não perdermos tempo com a especificação dos parâmetros:

    • read.csv() - (separador vírgula, decimal com ponto)
    • read.csv2() - (separador ponto e virgula, decimal vírgula)
    • read.delim() - (separador “\t” (TAB), e decimal ponto)
    • read.delim2() - (separador “\t” (TAB), e decimal vírgula)
  • Mais informações sobre elas, você encontra no help de read.table!!

Macete na especificação do caminho do arquivo

  • Para você não ter que ficar digitando toda vez o caminho completo até seu arquivo, há uma função que te permite navegar até o arquivo, selecioná-lo e, então guardar a sua localização como uma string em um objeto no R.

  • Tente:

arq.loc <- file.choose()

alt text

Exemplo: leitura de dados

  • Vamos ler um arquivo .csv do Fies: REPASSES122014.csv

  • Abra o arquivo antes do Excel e procure identificar quais parâmetros você deve passar para função do R;

  • Leia o arquivo com:
repasse.loc <- file.choose()
repasse.df <- read.csv2(file=repasse.loc, stringsAsFactors=FALSE)
  • Ou:
repasse.df <- read.table(file=repasse.loc, sep=";", dec=",", stringsAsFactors=FALSE)

Escrita de dados

  • A escrita de dados no R, segue a mesma lógica da leitura: há uma família de funções do tipo write.table(), com parâmetros parecidos com a read.table.

  • Também há suas derivadas… write.csv, write.csv2, write.delim, etc;

  • Verifique o help de write.table e seus argumentos !!

  • A forma mais simples da write.table é:

write.table(x = objeto_do_R, file="C:\\caminho\\até\\meu\\arquivo\\meu_arquivo.txt" )

Macete na especificação do caminho do arquivo

  • Para você não ter que ficar digitando toda vez o caminho completo até seu arquivo, há uma função que te permite navegar até um DIRETÓRIO (o arquivo ainda não existe), selecioná-lo e, então, guardar a sua localização como uma string em um objeto no R.

  • Tente:

dir.loc <- choose.dir()

alt text

  • Depois usamos a função paste para “grudar” o caminho até o diretório com um nome de arquivo a ser criado:
dir.loc <- choose.dir()
write.table(x = objeto_do_R, file=paste(dir.loc, "meu_arquivo_novo.csv", sep="\\"), sep=";" )

Exemplo: escrita de dados

  • Vamos utilizar o arquivo de repasses lido anteriormente no R;

  • Crie uma coluna nova qualquer nele, fazendo uma conta ou atribuindo strings, por exemplo;

  • Salve este arquivo em sua pasta Desktop e depois abra-o no Excel.

Algumas funções importantes:

  • Normalmente, sempre depois que lemos um banco de dados externo no R, verificamos sua integridade com algumas funções;
# verificar estrutura do data.frame:
str(repasse.df)
# calcular algumas estatísticas descritivas das colunas
summary(repasse.df)
## verificar somente algumas linhas do data.frame
head(repasse.df, 10) # primeiras 10 linhas
tail(repasse.df, 10) # últimas 10 linhas

# tabela de frequência:
# contando o número de alunos que apresenta percentual de risco == 20
#... e quantos apresentam risco == 25
table(repasse.df$PERC_RISCO)

# transpor dataframes ou matrizes  ou tabelas
t(table(repasse.df$PERC_RISCO))

# como extair partes do dataframe (equivalente a indexação)
subset(repasse.df, PERC_RISCO == 25)
# ou:
repasse.df[repasse.df$PERC_RISCO == 25, ]

# como encontrar e eliminar entradas com NA do meu data:
repasse.df[is.na(repasse.df$PERC_RISCO),] # is.na() retorna vetor lógico
# OBS : tudo que vetor numérico ou lógico podem ser utilizados como índices de outros objetos no R
# ou:
subset(repasse.df, PERC_RISCO == "NA") # função subset encara NA como uma string

# função with - para evitar ter que ficar digitando tda hora o nome do dataframe
repasse.df$nova_coluna <- with(reapsse.df, (VR_DIVIDA*PERC_RISCO)/VR_REPASSE)
  • Além dessas funções, você pode utilizar as que foram ensinadas na aula de manipulação e objetos!!

FIM

Obrigado!!