#============================================================================= # Estatística Computacional I www.leg.ufpr.br/ce083 # Curso de Estatística - 2013/2 # Prof. Walmes Zeviani # LEG - DEST - UFPR # # Aula 13 (08/10/2013) # * Importados de dados em arquivos com comprimento fixo de campo (fwf); # * Funções para manipular strings; # * Introdução às expressões regulares; #============================================================================= #----------------------------------------------------------------------------- # Algumas funções para leitura de arquivos. apropos("^read") #----------------------------------------------------------------------------- # Lendo linhas de um arquivo se separar campos. rl <- readLines("ss2000.txt") str(rl) head(rl, 20) ## Cada elemento do vetor é uma linha de texto. #----------------------------------------------------------------------------- # Separar as linhas de registro das linhas de informação/formatação. x <- c("asdasfasd (90)asda", "askdjas(098)sada") grep("\\(.\\d\\)", x) fica <- grep("\\(.\\d\\)", rl) # linhas que vão ficar rl <- rl[fica] head(rl, 20) #----------------------------------------------------------------------------- # Escrever as linhas que ficaram em um arquivo de texto. writeLines(rl, "ss2000b.txt") #----------------------------------------------------------------------------- # Ler separando os valores nos campos que tem comprimento fixo. # Arquivo do tipo fwf (fixed width format = formato de comprimento fixo). help(read.fwf, help_type="html") # 12 37 46 51 69 76 # | | | | | | # 1 1 TESFAYE JIFAR RAGASSA (76) 1 ELITM ETIOPIA( 0:44:15 0:44:15 # 2 18 GUILBERT OKARI ( 0) 2 ELITM KENIA() 0:44:32 0:44:30 # 3 3 JOHN YUDA ( 0) 3 ELITM TANZANIA 0:44:37 0:44:37 w <- c(12,37,46,51,69,76) w <- c(w[1], diff(w)) w # comprimento de cada campo #----------------------------------------------------------------------------- # Fazendo a leitura do arquivo, seleção das variáveis de interesse. da <- read.fwf("ss2000b.txt", widths=w, stringsAsFactors=FALSE) str(da) da <- subset(da, select=c(2,4,6)) str(da) #----------------------------------------------------------------------------- # Selecionando as variáveis durante a leitura. w <- c(-1,1,-1,1,-1,1)*w w # comprimento de campo negativo indica exclusão da <- read.fwf("ss2000b.txt", widths=w, stringsAsFactors=FALSE) str(da) names(da) <- c("nom","cat","tem") head(da, 10) #----------------------------------------------------------------------------- # Algumas funções básicas para manipular strings. ## substr : subdivide string por posições ## paste : concatena strings ## strsplit : divide string ## grep : procura com expressão regular ## agrep : procura com expressão regular aproximada ## gsub : procura e substituição com expressão regular ## nchar : comprimento de uma string help(substr, help_type="html") help(paste, help_type="html") help(strsplit, help_type="html") help(grep, help_type="html") #----------------------------------------------------------------------------- # Transformando os valores de categoria em sexo e faixa de idade. x <- c("M2529","F4045") substr(x, 1, 1) # pega a primeira letra a <- substr(x, 2, 3); a # pega 2 e 3 b <- substr(x, 4, 5); b # pega 4 e 5 paste("[", a, ", ", b, ")", sep="") # cocatena com formatação #----------------------------------------------------------------------------- # Aplicando aos dados. da$sexo <- substr(da$cat, 1, 1) a <- substr(da$cat, 2, 3) b <- substr(da$cat, 4, 5) da$fidade <- paste("[", a, ", ", b, ")", sep="") da$idade <- as.numeric(a) str(da) da <- subset(da, !is.na(idade)) # remove os NA criados devido ELITE head(da) #----------------------------------------------------------------------------- # Converter string de tempo H:M:S para tempo em minutos. da$min <- with(da, as.numeric(as.POSIXct(tem, format="%H:%M:%S")- as.POSIXct("00:00:00", format="%H:%M:%S"))) str(da) #----------------------------------------------------------------------------- # Tabelas e gráficos de frequência. tb <- table(da$sexo); tb barplot(tb) tb <- table(da$fidade) barplot(tb) #----------------------------------------------------------------------------- # Para rotacionar temos que alterar parâmetros gráficos. # Eles estão listados na lista par(), basta alterá-los. names(par()) # são parâmetros gráficos ## bg : cor de fundo (background) ## las: rotação do texto dos eixos ## mar: comprimento das quatro margens (inf, esq, sup, dir) par(las=2, mar=c(6,4,2,1), bg="seagreen") barplot(tb) dev.off() # isso fecha o despositivo gráfico # quando abrir novamente terá sido resetado plot(min~idade, data=da) #----------------------------------------------------------------------------- # Outras formas de partir uma string. x <- c("M2529","F4045") # com substr() substr(x, 1, 1) substr(x, 2, 3) substr(x, 4, 5) # com gsub() que é muito mais poderosa, reparte e formata gsub("^(.).*", "\\1", x) gsub("\\d", "", x) gsub("^.(..)(..)", "[\\1,\\2)", x) gsub("^.(\\d{2})(\\d{2})", "[\\1,\\2)", x) #----------------------------------------------------------------------------- # Sobre expressões regulares. ## Representantes ## . qualquer coisa ## \\d números ## \\D não números ## \\w números e letras ## \\W não números e letras ## \\s espaço ## [A-Z] maiúsculas ## [1-5] conjunto de 1 à 5 ## [aeiou] só vogais ## [^aeiou] exceto vogais (^ toma o complementar, nega) ## Quantificadores ## * zero ou mais ## + um ou mais ## ? zero ou um ## {n} exatamente n ## {n,} pelo menos n ## {n,m} pelo menos n mas até m ## Posicionadores (âncoras) ## ^ início da string ## $ final da string ## \\b borda de palavra ## Veja mais em: ## http://pt.wikipedia.org/wiki/Express%C3%A3o_regular ## http://gnulinuxbr.com/category/expressao-regular/ ## http://msdn.microsoft.com/pt-br/library/vstudio/az24scfc.aspx #----------------------------------------------------------------------------- # Amplitude de tempo para cada faixa de idade. r <- with(da, tapply(min, fidade, range)) s <- do.call(rbind, r) str(s) # é matriz s colnames(s) <- c("mínimo","máximo") s <- cbind(fidade=rownames(s), as.data.frame(s)) rownames(s) <- NULL str(s) # data.frame s write.table(s, "ampli.txt", quote=FALSE, row.names=FALSE) #----------------------------------------------------------------------------- # Exportando gráficos. # no pdf cada gráfico sai em uma página pdf("graficos.pdf") plot(min~idade, data=da) barplot(tb) dev.off() # reparte a janela gráfica para ter 2 gráficos (1 linha, 2 colunas) par(mfrow=c(1,2)) plot(min~idade, data=da) barplot(tb) layout(1) # volta para 1 gráfico por janela i <- da$sexo=="M" # TRUE se M e FALSE se F plot(density(da$min[i])) # dos Homens lines(density(da$min[!i]), col=2) # das Mulheres legend("topright", legend=c("Homens","Mulheres"), col=1:2, lty=1, bty="n") #----------------------------------------------------------------------------- # Tem como saber o valor da moda? dM <- density(da$min[i]) dF <- density(da$min[!i]) str(dM) dM$x[which.max(dM$y)] dF$x[which.max(dF$y)] plot(dM) lines(dF, col=2) abline(v=dM$x[which.max(dM$y)]) abline(v=dF$x[which.max(dF$y)], col=2) legend("topright", legend=c("Homens","Mulheres"), col=1:2, lty=1, bty="n") ## Veja mais em: ## https://ridiculas.wordpress.com/2011/11/18/moda-de-uma-amostra-metodo-do-histograma-vs-metodo-kernel/ #-----------------------------------------------------------------------------