Lendo dados de teclado e da área de transferência
## digitar dados com <ENTER> após cada registro. Digitar um <ENTER> a mais para encerrar. s1 <- scan() ## recortar (CTRL-C) os seguintes 12 13 14 21 21 14 12 31 25 15 32 29 ## lendo como vetor... s1 <- scan("clipboard") ## .. e transformando para matriz ## le por linhas, portanto para montar matriz de ser por linha matrix(s1, nc=3, byrow=T) ## agora lendo diretamente como data-frame d1 <- read.table("clipboard") d1 ## mais opcoes ## recortar (CTRL-C) os seguintes X; Y; Z; S 12,3; 13; 14,2; A 21,2; 21; 14,0; A 12,1; 31; 25,1; B 15,1; 32; 29,9; B d2 <- read.table("clipboard", sep=";", dec=",", header=T) d2
Exemplo lendo tabelas da página do MCT/Indicadores
Acessar tabelas na web por www.mct.gov.br/indicadores
Tabela de Produçãoo científica, tabela 5.1 (pesquisadores)
## Marcar/CTRL-C a tabela de indicadores de pesquisadores pcPesq <- read.table("clipboard", sep="\t", dec=",") head(pcPesq) ## uma um pouco melhor usando mais argumentos pcPesq <- read.table("clipboard", sep="\t", dec=",", strip.white=T, as.is=T) head(pcPesq) str(pcPesq)
Note que todas as colunas, exceto a primeira, foram lidas como caracteres!
Note que a tabela usa o caracter "." para separar milhares.
Entretanto o R usa "." como caracter de separação decimal
Duas possíveis formas para contornar e ajustar os dados neste contexto:
pcPesq$V2 as.numeric(pcPesq$V2) as.numeric(pcPesq$V2)*1000 ## agora automatizando para fazer em todas as colunas necessárias Pesq <- as.data.frame(lapply(pcPesq, function(x){if(is.character(x)) x <- as.numeric(x)*1000; return(x)})) Pesq
Pesq1 <- as.data.frame(lapply(pcPesq, function(x){ if(!is.numeric(x) & !is.integer(x)) x <- as.numeric(gsub("\\.", "", x)) return(x)}))
Algumas operações ilustrando funções *apply
Tot.L <- function(x) sum(x[-1]) Pesq$Total <- apply(Pesq, 1, Tot.L) Pesq ## Eliminando a coluna Pesq$Total <- NULL Pesq
Uma função para criar uma nova coluna que seria um indicador calculado com os dados
## uma função simples Indic <- function(x){ return((sum(x[c(2,3,4)])/max(x[c(5,6)])) - mean(x[c(7,8)])) } ## uma versao mais elaborada Indic <- function(x, na.rm=T, metodo){ metodo <- match.arg(metodo, choice=c("mean","median")) ## testando se os dados sao numéricos if(any(!is.numeric(x[-1]))){ stop("dados não numéricos") } ## mensagem de alerta if(any(is.na(x[-1]))) warning("dados incompletos") S1 <- sum(x[c(2,3,4)], na.rm=na.rm) S2 <- max(x[c(5,6)], na.rm=na.rm) ## duas formas de fazer e escolha da funcao (if ou do.call) if(metodo == "mean") S3 <- mean(x[c(7,8)], na.rm=na.rm) if(metodo == "median") S3 <- median(x[c(7,8)], na.rm=na.rm) # do.call(metodo, x[c(7,8)], na.rm=na.rm) Ind <- (S1/S2) - S3 return(Ind) } apply(Pesq, 1, Indic) apply(Pesq, 1, Indic, na.rm=F) apply(Pesq, 2, mean, na.rm=T)
lapply()
e sapply()
para listas e data-frames. A segunda simplifica o resultado da primeira se possível.
fc <- function(x) c(mean(x[-1]), median(x[-1])) lapply(Pesq, fc) sapply(Pesq, fc)
Agora lendo os indicadores de estudantes e depois unir tudo em um único objeto
pcEst <- read.table("clipboard", sep="\t", dec=",", strip.white=T, as.is=T) head(pcEst) Est <- as.data.frame(lapply(pcEst, function(x){if(is.character(x)) x <- as.numeric(x)*1000; return(x)})) Est Pesq$Autor <- "Pesquisador" Est$Autor <- "Estudante" ProdC <- rbind(Pesq, Est) ProdC head(ProdC) names(ProdC) <- c("Ano","Autores","Nacional","Internacional","Anais", "Livros", "Capítulos", "Outras", "Autor") head(ProdC) ## sempre bom remover o que não é mais necessário... rm(pcEst, pcPesq, Pesq1, Pesq, Est)
Operações por grupos
podem sere feitas com tapply()
, by()
ou aggregate()
with(ProdC, tapply(Autores, Ano, sum)) with(ProdC, by(Autores, Ano, sum)) aggregate(Autores ~ Ano, data=ProdC, sum)
Alguns gráficos
Vamos ilustrar o uso de três (3) dispositivos gráficos do R:
graphics
/default)lattice
ggplot
I. gráficos com graphics
(padrões do sistema)
## produção total, somando pesquisadores e estudantes AuporAno <- aggregate(Autores ~ Ano, data=ProdC, sum) AuporAno plot(AuporAno) plot(AuporAno, type="b", main="Número total de autores") ## somando agora todas as produções de Perq e Estudantes por ano Totais <- aggregate(. ~ Ano, data=ProdC[,-9], sum) matplot(Totais[,1], Totais[,-1], type="l") names(Totais) matplot(Totais[,1], Totais[,-1], type="l", col=c(1, 2, 2, 3, 4, 4, 5), lty=c(1,1,2,1,1,2,5), xlab="Ano", ylab="Quantidade", main="Produção Científica") legend("topleft", names(Totais)[-1], col=c(1, 2, 2, 3, 4, 4, 5), lty=c(1,1,2,1,1,2,5)) ## agora separando entre Pesquisadores e Estudantes ## gráficos podem ser feitos de várias formas, aqui alguns exemplos with(ProdC, plot(Autores ~ Ano, type="n")) with(ProdC, text(Ano, Autores, substr(Autor, 1, 1)) with(ProdC, coplot(Autores ~ Ano|Autor, type="b")) with(ProdC, coplot(Autores ~ Ano|Autor, type="b", show.given=F)) with(subset(ProdC, Autor=="Pesquisador"), plot(Autores ~ Ano, type="b")) with(subset(ProdC, Autor=="Estudante"), lines(Autores ~ Ano, type="b", col=2)) AU <- reshape(ProdC[,c(1,2,9)], idvar="Ano", v.name="Autores", timevar="Autor", direction="wide") matplot(AU[,1], AU[,-1], type="l", col=c(2,4), lty=1, main="Evolução do número de autores", xlab="Ano", ylab="Número de Autores") legend("topleft", c("Pesquisadores","Estudandes"), col=c(2,4), lty=1)
II. Gráficos da biblioteca lattice
require(lattice) # gráficos de dispersão xyplot(Autores~Ano, data=ProdC) xyplot(Autores~Ano, groups=Autor, data=ProdC) xyplot(Autores~Ano, groups=Autor, data=ProdC, auto.key=TRUE) xyplot(Autores~Ano, groups=Autor, data=ProdC, auto.key=TRUE, type="b") xyplot(Autores~Ano, groups=Autor, data=ProdC, auto.key=TRUE, type=c("p","smooth")) xyplot(Nacional+Internacional~Ano|Autor, data=ProdC) xyplot(Nacional+Internacional~Ano|Autor, data=ProdC, auto.key=TRUE, type=c("p","smooth")) xyplot(Nacional+Internacional~Ano|Autor, data=ProdC, auto.key=TRUE, type=c("p","r")) xyplot(Nacional+Internacional~Ano|Autor, data=ProdC, auto.key=TRUE, type=c("p","r","g")) #------------------------------------------------------------------------------------------ # gráficos de barras str(ProdC) barchart(Autores~Ano, groups=Autor, data=ProdC, horizontal=FALSE) barchart(Nacional+Internacional~Ano|Autor, data=ProdC, horizontal=FALSE) require(reshape) ProdC2 <- melt(ProdC, id=c("Ano","Autor")) str(ProdC2) barchart(value~Ano|variable, groups=Autor, data=ProdC2, horizontal=FALSE) barchart(value~Ano|variable, groups=Autor, data=ProdC2, horizontal=FALSE, scales="free") barchart(value~Ano|variable, groups=Autor, data=ProdC2, horizontal=FALSE, scales=list(x="same", y="free")) barchart(value~Autor|Ano, groups=variable, data=ProdC2, horizontal=FALSE) barchart(value~Autor|factor(Ano), groups=variable, data=ProdC2, horizontal=FALSE) barchart(value~Autor|factor(Ano), groups=variable, data=ProdC2, horizontal=FALSE, auto.key=TRUE) barchart(value~Autor|factor(Ano), groups=variable, data=ProdC2, horizontal=FALSE, auto.key=list(space="right")) barchart(value~Autor|factor(Ano), groups=variable, data=ProdC2, horizontal=FALSE, auto.key=list(columns=4))
III. Gráficos da biblioteca ggplot
install.packages("ggplot2", dep=T) ## contributed package" - é necessário instalar! require(ggplot2)
Outro exemplo: (novos elementos: dados faltantes, caracteres de decimais e milhares)
Dados sócio econômicos –> Tabela 9.1
ScEc <- read.table("clipboard", dec=",", sep="\t", na.strings="\\u2026 ") head(ScEc) ScEc <- as.data.frame(lapply(pcPesq, ptMil))