====== Entrada de dados e gráficos ======
Lendo dados de teclado e da área de transferência
## digitar dados com após cada registro. Digitar um 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:
- Item de lista ordenada converter para números e multiplicar por mil
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
- Eliminando o caracter "." (por substituição de caracteres.
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:
- Gráficos básicos do sistema (pacote ''graphics''/default)
- Gráficos da biblioteca ''lattice''
- Gráficos da biblioteca ''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))