Não foi possível enviar o arquivo. Será algum problema com as permissões?
Entrada de dados e gráficos

Entrada de dados e gráficos

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:

  1. 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
  2. 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:

  1. Gráficos básicos do sistema (pacote graphics/default)
  2. Gráficos da biblioteca lattice
  3. 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))


QR Code
QR Code cursos:mct:exemplo1a (generated for current page)