====== 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.
* 1) Exportar os dados no excel para o formato texto (txt ou csv) e importar no R conforme mencionado anteriormente
* 2) Usar funções de pacotes especialistas do R para importar/exportar/manipilar arquivos excel. Alguns deles:
* ''xlsReadWrite'' (apenas no Windows)
* ''xlsx''
* ''gdata''
* ''XLConnect''
* ''RExcelInstaller'' (apenas no Windows)
* 3) Driver genéricos
* ''RODBC''
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("
Use um arquivo CSS para configurar a pagina!!!",file=saida)
lapply(res, HTML, file=saida)
HTMLEndFile()