Entrada de dados por aquivos

Entrada de dados por aquivos

O R importa dados de arquivos de diferentes formatos.

O mais comum e possivelmente mais geral é a importação de arquivos em formato texto, tipicamente com extensões txt, csv usando as funções read.table(), read.csv() e read.csv2().

Muitos outros formatos são possíveis, incluindo os de outros programas estatísticos. Há funções específicas para cada um deles.

Importação de planilhas

É comum encontrar dados no formatos de planilhas do MS-Excel. Há várias alternativas para ler estas planilhas e listamos algumas a seguir.

Exemplo fornecido pelo Roberto

## preparando a internet para uso no MCT
setInternet2()
 
## instalando pacote
install.packages("XLConnect", dep=T) 
 
## definindo uma função para facilitar importação
ReadExcel <- function (FileName) {
  require(XLConnect)
  wb <- loadWorkbook(FileName)
  data <- readWorksheet(wb, sheet = 1)
  return(data)
} 
 
## lendo
dados <- ReadExcel("COLOQUE_AQUI_O_NOME_DO_SEU_ARQUIVO")

Dados de largura fixa

Considere que temos um arquivo de dados exFWF.txt com o seguinte conteúdo. Considere ainda que estes dados se reverem a 4 variáveis, sendo que os 2 primeiros campos da primeira, depois 3 da segunda, 6 de terceira e 2 da quarta.

  1200512345627
  1100227372912
  1000312034115
  0900414732112

Lendo as dados com colunas de tamanho definido

foo <- read.fwf("exFWF.txt", wid=c(2,3,6,2))
foo

É possível excluir um conjunto de caracteres (uma ou mais variáveis), usando índices negativos.
Isto permite selecionar somente o que se quer ler.

read.fwf("exFWF.txt", wid=c(2,-3,6,2))

Agora vamos supor que temos uma variável (como caracter) com a especificação da composição das colunas.
Supondo que a terceira variável tem duas casas decimal e a quarta tem uma e a variável seria da forma:

DEC <- c("2", "3", "4,2", "1,1")

Vamos ilustrar o uso da linguagem com alguns elementos usados para ler e preparar os dados.

## achando o total de caracteres de cada campo
foo1 <- strsplit(DEC, split=",")
foo1
foo2 <- sapply(foo1, function(x) sum(as.numeric(x)))
foo2
read.fwf("exFWF.txt", wid=foo2)

Agora preparando os campos decimais.

foo3 <- sapply(foo1, function(x) as.numeric(x[2]))
foo3
COLS <- !is.na(foo3)
COLS
 
sweep(data.matrix(foo[,COLS]), 2, 10^foo3[COLS], FUN="/")
foo[,COLS] <- sweep(data.matrix(foo[,COLS]), 2, 10^foo3[COLS], FUN="/")
foo

Limpeza…

rm(foo, DEC, foo1, foo2, foo3)

Agora vamos montar uma função que concatena os comandos acima para facilitar a leitura de arquivos deste tipo sempre que preciso.

read.meudado <- function(file, formato, ...){
       lformato <- strsplit(formato, split=",")
       ncampos <- sapply(lformato, function(x) sum(as.numeric(x)))
       arq <- read.fwf(file, width=ncampos, ...)
       decimais <- sapply(lformato, function(x) as.numeric(x[2]))
	   COLS <- !is.na(decimais) 
       arq[,COLS] <- sweep(data.matrix(arq[,COLS, drop=F]), 2, 10^decimais[COLS], FUN="/")
	   return(arq)
}
 
read.meudado("exFWF.txt", formato = DEC)

Outro exemplo, os dados abaixo no arquivo exFWF-2.txt, com campos alfanuméricos no arquivo.

 12005AA12345627
 11002BB27372912
 10003BB12034115
 09004CC14732112

read.fwf("exFWF-2.txt", wid=c(2,3,2,6,2))
 
DEC1 <- c("2", "3", "2", "4,2", "1,1")
read.meudado("exFWF-2.txt", formato = DEC1)

Outro exemplo, os dados abaixo no arquivo exFWF-3.txt, com campos alfanuméricos no arquivo e linhas a serem ignoradas.

 Dados no formato FWF
 Exemplo do curso
 12005AA12345627
 11002BB27372912
 10003BB12034115
 09004CC14732112

Lendo com a função, note o uso do mecanismo de . . . para passar argumentos para read.fwf()

read.meudado("exFWF-3.txt", formato = DEC1, skip=2)

Dados reais da Regina

Lendo arquivo descritor

desc <- read.table("dados/11CRDDI.ref.txt", as.is=T)
desc
desc$V3
 
desc$V4 <- ifelse(desc$V2 == "A", "character", "integer")
desc
desc$V4[grep("\\,", desc$V3)] <- "numeric"
desc

Lendo os dados usando nossa função.

Regina <- read.meudado("dados/11CRDDI.txt", formato = desc$V3, as.is=T )
#, skip=2, n=20)
Regina
 
## algumas operacoes uteis:
which(grepl("\\,", desc$V3))
which(desc$V4=="integer")
which(grepl("CREDITO", desc$V1))
Regina[,which(grepl("CREDITO", desc$V1))]
apply(Regina[,which(grepl("CREDITO", desc$V1))], 1, sum)
 
## colocar aqui os nome dasd variaveis trabalhado/cortado etc
#names(Regina) <- desc$V1
 
Regina$V29
as.Date(as.character(Regina$V29), "%Y%m%d")
 
Regina$V29 <- as.Date(as.character(Regina$V29), "%Y%m%d")
 
Regina <- read.meudado("dados/11CRDDI.txt", formato = desc$V3, as.is=T, skip=2, n=15)
Regina

Queremos ordenar os dados por data. Antes uma revisão sobre ordenação.

x <- rpois(10, lam=10)
x
sort(x)
order(x)
x[order(x)]
x[rev(order(x))]
args(order)
order(x, decreasing=T)

Agora de volta aos dados

Regina <- Regina[order(Regina$V29),]
Regina
Regina[, c("V7","V8","V9","V29")]
aggregate(V7+V8+V9 ~ V29, FUN=sum, data=Regina)
 
## algumas manipulacoes
Regina[,c(7,8,9,29)]
 
aggregate(. ~ V29, data=Regina[,c(7,8,9,29)], FUN=sum)
aggregate(V7+V8 ~ V29, data=Regina[,c(7,8,9,29)], FUN=sum)
aggregate(cbind(V7,V8) ~ V29, data=Regina[,c(7,8,9,29)], FUN=sum)

Um pequeno exemplo de análises automáticas

Suponha que voce tem um diretório (pasta) com alguns arquivos que devem ser lidos e processados por análises

Vamos supor aqui o diretório Regina com arquivos com o seguinte conteúdo que supomos ser o mês e a despesa:

dir.create("Regina")
cat(
"12  23,10 \n",
"12  20,70 \n",
"10  12,10 \n",
"10  8,13  \n",
 file = "Regina/arq1.txt")

cat(
"09  33,10 \n",
"09  50,70 \n",
"10  22,10 \n",
"10  18,13 \n",
 file = "Regina/arq2.txt")

Para cada um dos arquivos queremos:
(i) ler os dados, (ii) calcular a despesa total por mês, (iii) colocar os resultados em uma página html.

arquivos <- dir("Regina", full.names=T)
arquivos
 
names(arquivos) <- c("MCT", "MEC")
arquivos
 
resumo1 <- function(x){
    gastos <- read.table(x, dec=",", head=F)
    names(gastos) <- c("Mes", "Despesa")
    totM <- aggregate(Despesa ~ Mes, FUN = sum, data=gastos)
    return(totM)
    }
 
res <- lapply(arquivos, resumo1)
res
 
require(R2HTML)
saida <- HTMLInitFile("./",filename="regina", BackGroundColor="#BBBBEE")
HTML.title("Exemplo simples de automatizacao de analise", file=saida)
HTML("<br>Use um arquivo CSS para configurar a pagina!!!",file=saida)
lapply(res, HTML, file=saida)
HTMLEndFile()