curso básico de r
DESCRIPTION
Curso básico de R preparado para o MCTITRANSCRIPT
Prof. Dr. Roberto Dantas de Pinho, [email protected]
Este curso tomou como base material dos profs. Dr. Paulo Justiniano Ribeiro Jr (UFPR) e Dr. Cosme Marcelo Furtado Passos da Silva (FIOCRUZ)
1
Um primeira sessão com o R
Objetos Entrada de dados Agora que temos
os dados... Algumas análises
Filtragem e seleção
Salvando seu trabalho
Manipulando dados
Somas e agregações
Regressão linear
2
E muitas outras coisas ao longo do caminho
Você pode usar o R para avaliar algumas expressões aritméticas simples. Digite:1 + 2 + 3
2 + 3 * 4
3/2 + 1
4 * 3**3
O R é uma ambiente e uma linguagem
6
O ambiente R permite que você envie comandos e veja seus resultados imediatamente
A linguagem R é composta pelo conjunto de regras e funções disponíveis que podem ser executados no ambiente R.
Você pode juntar sequências de comandos em scripts para uso posterior
7
Um série de funções estão disponíveis. Alguns exemplos simples:
sqrt(2)
abs(-10)
sin(pi)
pi é uma constante do R, seu valor já é definido
2
10
)sin(
8
Resultados, dados de entrada , tabelas, etcsão armazenados no R em Objetos
Objetos possuem um nome, conteúdo , um tipo e são armazenados na memória. Ex.
Criar o objeto “x” contendo o número 10:x <- 10
Exibir o conteúdo de x:x
No R, abc é diferente de ABC
9
Experimente:X <- sqrt(2)
Y = sin(pi)
Z = sqrt(X+Y)
Nos exemplos acima, X, Y e Z armazenam os resultados das respectivas operações
No R, sempre existem muitas formas de fazer a mesma coisa.
<- e = são equivalentes.
Vamos focar sempre em uma.
10
Qual o valor de C ao final da sequência de comandos abaixo?A = 1
B = 2
C = A + B
A = 5
B = 5
Por quê?
11
12
Ambiente que facilita o uso do R Organiza as janelas de trabalho Acesso facilitado aos objetos e histórico de
comandos.
13
Edição de Scripts e
exibição de objetos
Console
14
Lista de objetos
e histórico
Ajuda, gráficos,
arquivos e
pacotes
15
Objeto que armazena múltiplos dados de um único tipo
A função c( ) (“c” de concatenar ou de conjunto) permite agrupar valores para formar um vetor:X = c(1,3,6)
Para acessar elementos do vetor:X[1] X[3]
16
Operações aritméticas e funções podem ser aplicadas a todo um vetor. Ex.X = c(1,3,5)
Y = c(10,20,30)
X+Y
11 23 35
sum(X)
9
E X + 100 ?101 103 105 pela Lei da reciclagem
17
Quando o tamanho pedido por uma operação é diferente dos dados disponíveis, os dados existentes são repetidos até completar o necessário.
Como X tem 3 elementos, X+100 é o
mesmo que X + c(100,100,100)
18
> X = 1:10
> [1] 1 2 3 4 5 6 7 8 9 10
> X = seq(0,1,by=0.1)
> [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> rep(“a”,5)
> “a” “a” “a” “a” “a”
> nomes = c("fulano", "beltrano",
"cicrano")
> nomes [1] "fulano" "beltrano" "cicrano"
> letras = letters[1:5]
> letras [1] "a" "b" "c" "d" "e"
> letras = LETTERS[1:5]
> letras [1] "A" "B" "C" "D" "E"
19
numeric is.numeric( )
as.numeric( )
character is.character( )
as.character( )
integer is.integer( )
as.integer( )
logical T == TRUE == 1
F == FALSE == 0
A == B significa “A é igual a B?”
20
Vetor organizado em linhas e colunasm1 <- matrix(1:12, ncol = 3)
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
21
length(m1) [1] 12 dim(m1) [1] 4 3 nrow(m1) [1] 4 ncol(m1) [1] 3
22
m1[1, 2]
[1] 5
m1[2, 2]
[1] 6
m1[ , 2]
[1] 5 6 7 8
m1[3, ]
[1] 3 7 11
23
m1[1,2]= 99
muda o valor da célula
m1[1:2, 2:3]
[,1] [,2]
[1,] 5 9
[2,] 6 10
24
colnames(m1)
NULL
rownames(m1)
NULL
colnames(m1) = c("C1","C2","C3")
m1[,”C1”]
[1] 1 2 3 4t(m1) transposta de m1
25
“matriz” com várias dimensões. Ex. com 3 dim.:ar1 <- array(1:24, dim = c(3, 4, 2)), , 1
[,1] [,2] [,3] [,4][1,] 1 4 7 10[2,] 2 5 8 11[3,] 3 6 9 12
, , 2
[,1] [,2] [,3] [,4][1,] 13 16 19 22[2,] 14 17 20 23[3,] 15 18 21 24
Para um array de 3 dimensões, você pode entender a 3ª
dimensão como uma coleção de matrizes.
1ª matriz
2ª matriz
26
Como trabalhar com coisas assim?
Ano UFCódigo do ÓrgãoÓrgão Código da UO unidade orçamentária função subfunção programa açãolocalizador descrição da ação valor P&D valor ACTC
2010 AC 1
Adm
direta e
indireta 1 Adm direta e indireta 19 121 2056 1548
MODERNIZAÇÃO DO SISTEMA DE
PLANEJAMENTO E GESTÃO DA SDCT R$ - R$ 16.655,00
2010 AC 1
Adm
direta e
indireta 1 Adm direta e indireta 19 121 2056 1549
PROGRAMA DE COOPERAÇÃO TÉCNICA E
FINANCEIRA COM INSTIT. NAC. INTERN.
GOVERNAMENTAIS E NÃO
GOVERNAMENTAIS R$ - R$ 715.000,00
2010 AC 1
Adm
direta e
indireta 1 Adm direta e indireta 19 122 2009 2224
MANUTENÇÃO DO GABINETE DO SECRETÁ
RIO R$ - R$ 27.732,11
2010 AC 1
Adm
direta e
indireta 1 Adm direta e indireta 19 122 2009 2227 DEPARTAMENTO DE GESTÃO INTERNA R$ - R$ 2.266.169,90
27
Cada coluna tem o seu tipod = data.frame(letters[1:4], 1:4, 10.5)
letters.1.4. X1.4 X10.5
1 a 1 10.5
2 b 2 10.5
3 c 3 10.5
4 d 4 10.5
Podemos mudar o nome das colunas:colnames(d) = c("letra","num", "valor")
colnames(d)
[1] "letra" "num" "valor“
d$valor # seleciona a coluna “valor” de d
colnames(d) [1] "letra" "num" "valor"
Na maior parte do tempo usaremos data.frames
28
lista fator
29
veremos depois...
Diversas fontes. Veremos:
Teclado x = scan( )
Arquivos Excel
Arquivos CSV
Bancos de Dados SQL
30
require(XLConnect)
wb <- loadWorkbook(“AC_PDACTCaula.xls”)
plan1 <- readWorksheet(wb, sheet = 1)
str(plan1)
View(plan1)
31
require(XLConnect)
Carrega o pacote XLConnect Pacotes são conjuntos de funções e dados
que adicionam funcionalidades ao R. Se o pacote não estiver instalado:
setInternet2() #somente no windows
install.packages("XLConnect", dep=T)
32
Cria um objeto “wb” que aponta para o arquivo excel:
wb <-
loadWorkbook(“AC_PDACTCaula.xls”)
33
Carrega os dados da primeira planilha (“aba”) em um objeto chamado “plan1”
plan1 <- readWorksheet(wb, sheet = 1)
As funções no R identificam os parâmetros pela ordem
34
As funções no R identificam os
parâmetros pela ordem
Ou utilizando o nome do
parâmetro
Mostra a estrutura do objeto criado:
str(plan1)
Mostra os dados carregados em uma janela:
View(plan1)
35
str() funciona para qualquer
objeto do R. É muito útil.
No RStudio, você pode clicar em um objeto na lista de objetos
args(readWorksheet) #mostra parâmetros
function (
object, #o workbook “wb”
sheet, #número ou nome da
“aba”/planilha
startRow, #linha inicial daimportação
startCol, #col. inicial da importação
endRow, #linha final da importação
endCol, #col. final da importação
header # T ou F: usar primeira
linha para dar nome às
colunas )
36
Comma-separated values: valores separados por vírgula
Formato de arquivo muito comum para troca de dados
São comuns outros separadores: <tab> ; <espaço>
Exemplo:uf ano valido somaactc somapd
AC 2009 1 34296430.67 3630841.04
AC 2010 1 29397712.04 3579715.12
AL 2009 1 12650160.51 8903714.41
37
Exemplo:uf ano valido somaactc somapd
AC 2009 1 34296430,67 3630841,04
AC 2010 1 29397712,04 3579715,12
AL 2009 1 12650160,51 8903714,41
Para ler este arquivo:d = read.csv(file="AgregaUF20110930_b.txt",
header=T, # usa primeira linha como cabeçalho
sep="\t", # separador de valores é <tab>
dec="," # separador decimal é vírgula
)
38
str(d) #estrutura criada
summary(d) #resumo estatístico
head(d) #primeiros registros
tail(d) #últimos registros
plot(d) #visualização padrão
39
require(RODBC)
canal <- odbcConnect(
“base_ODBC",
case="tolower“,
uid=“usuário”,
pwd=“senha”)
d <- sqlQuery(canal,
”select * from tabela where ano = 2010”,
as.is=T)
40
Como fazer a soma de uma coluna de um data.frame?sum(data.frame$coluna)
sum(d$somapd)
[1] NA
41
NA Not Available
denota dados faltantes. Note que deve utilizar maiúsculas.
NaN Not a Number
denota um valor que não é representável por um número.
Inf e -Inf
mais ou menos infinito.
42
Tente: c(-1,0,1)/0
Soma:sum(d$somapd, na.rm=T)
[1] 4836882446
Média:sum(d$somapd, na.rm=T)
Mediana:median(d$somapd, na.rm=T)
Desvio padrão:sd(d$somapd, na.rm=T)
43
Para estes exemplos:milsa = read.csv("milsaText.txt",
sep="\t", head=T, dec=".")
44
Frequências absolutastable(milsa$civil)
Frequências relativastable(milsa$civil) /
length(milsa$civil)
ou
prop.table(milsa$civil)
Gráfico de setorespie(table(milsa$civil))
45
Com attach(milsa)
Frequências absolutastable(civil)
Frequências relativastable(civil) /
length(civil)
ou
prop.table(civil)
Gráfico de setorespie(table(civil))
46
depois: detach(milsa)
Gráfico de barras:barplot(table(instrucao))
Lembrando:
Posso salvar resultados como objetos e usá-los várias vezes
instrucao.tb = table(instrucao)
barplot(instrucao.tb )
pie(instrucao.tb )
47
Tente:prop.table(filhos)
Solução:prop.table(table(filhos))
Outra solução:
Filtrar os elementos com NA
48
mean(filhos, na.rm=T) #média
median(filhos, na.rm=T) #mediana
range(filhos, na.rm=T) #amplitude
var(filhos, na.rm=T) #variância
sd(filhos, na.rm=T) #desvio padrão
Quartis: filhos.quartis = quantile(filhos, na.rm=T)
Amplitude inter-quartis:
filhos.quartis [4] -filhos.quartis [1]
49
plot(milsa)
plot(salario ~ ano)
hist(salario)
boxplot(salario)
stem(salario)
50
Selecionando algumas linhas milsaNovo = milsa[c(1,3,5,6) , ]
Selecionando algumas colunas milsaNovo = milsa[ , c(1,3,5)]
milsaNovo = milsa[ , c(“funcionario”,
”instrucao“, “salario”)]
Atenção: Cria cópia
milsaNovo=milsa[c(1,3,5,6) ,]
Substitui anterior milsa=milsa[c(1,3,5,6) , ]
51
Quem ganha acima da mediana acimamediana = milsa[ salario >
median(salario), ]
Quais são os casados com nível superior? casadoEsuperior = milsa[
civil==“casado” & instrucao ==
“Superior”, ]
52
E: ambas as condições devem ser verdadeiras
Quais são os casados ou quem tem nível superior?
casadoOUsuperior = milsa[
civil==“casado” | instrucao ==
“Superior”, ]
53
OU: pelo menos uma das condições deve ser
verdadeira
milsaLimpo=milsa[!is.na(salario), ]
Em português: Nova tabela milsaLimpo
É igual =
Tabela antiga milsa
Selecione [
Linhas Salário não é NA ! is.na(salario)
e todas as colunas , ]
54
NÃO
QUANTOS são os casados? sum(civil==“casado”)
ou
table(civil)["casado"]
QUANTOS são os casados e tem nível superior? sum(civil==“casado” & instrucao
== “Superior” )
table(civil,instrucao)["casado",
"Superior"]
55
milsaNovo é igual a milsa, sem as linhas 1,2 e 5 e sem as colunas 1 e 8:
milsaNovo =
milsa[-c(1,2,5), -c(1,8)]
56
sup = which(instrucao=="Superior“)
[1] 19 24 31 33 34 36
Posso usar depois: mean(milsa[sup,”salario”])
Média salarial dos que tem nível superior
57
Quais linhas atendem à condição
vantagem: não cria cópia!!
Uma amostra aleatória de 10 elementos de milsa:
amostra =
sample(x=nrow(milsa),size=10)
[1] 12 29 1 3 17 14 26 33 20
31
Média salarial da amostra:
mean(milsa[amostra,”salario”])
58
Em ordem de número de filhos:milsa[order(filhos),]
Decrescente:milsa[order(filhos, decreasing=T),]
Em ordem de número de filhos e depois por idade:milsa[order(filhos,ano),]
Ver os 10 mais novos:head(milsa[order(ano),], 10)
Ver os 10 mais velhos:tail(milsa[order(ano),], 10)
59
Apagando um objeto
rm(milsaNovo)
Apagando tudo
rm(list = ls())
60
ls() : lista de objetos correntes
Objetos do tipo lista são coleções que podem conter objetos de tipos diferentes.
lis = list(A=1:10, B=“Texto”,
C = matrix(1:9,ncol=3)
São muito utilizadas na passagem de parâmetros para funções ou nos resultados de funções.
lis[1:2]
uma lista com os dois primeiros itens de lis (A e B) lis[[1]]: objeto armazenado na primeira posição da lista ( o conteúdo
de A). O mesmo que lis$A
61
Para salvar todos os objetos:save.image(“arquivo.RData”)
Para salvar alguns objetos:save( x, y,
file=“arquivo.RData”)
Carregando:load(“arquivo.RData“)
62
Vários “load”: os objetos com nomes distintos se acumulam
Salvar um script “.R” que reproduza os passos feitos.
Vantagem: Além de servir de documentação da criação da base, incorpora alterações na base, se houver.
Modelo híbrido:
Resultados intermediários que requerem muito tempo processamento pode ser salvos em imagem. Ex. agregação de dados de empregados por empresa
63
Criando uma coluna em um data.frame:
milsa$idade =
milsa$ano + milsa$mes/12
64
65
X Y
6+3+5=14
66
X Y
67
X Y
68
X Y
69
X Y
Exemplo:
com
70
Registros com correspondência :merge(x=milsa,
y=tabInst,by.x="instrucao", by.y="desc“,
all=F)
Todos os registros da tabela X:merge(x=milsa,
y=tabInst,by.x="instrucao", by.y="desc",
all.x=T)
71
Todos os registros da tabela y:merge(x=milsa,
y=tabInst,by.x="instrucao", by.y="desc",
all.y=T)
Todos os registros das tabela x e y:merge(x=milsa,
y=tabInst,by.x="instrucao",
by.y="desc", all=T)
72
De texto para númerod.f$novaColuna = as.numeric(d.f$coluna)
De número para texto:d.f$novaColuna=as.character(d.f$coluna)
De texto ou número para inteiro:d.f$novaColuna = as.integer(d.f$coluna)
73
Inteiros economizam memória
Representação de variáveis qualitativas
Nominais
▪ “casado”, “solteiro”
Ordinais
▪ “alto”, “baixo”
Economizam espaço de memória Tratamento apropriado para este tipo de
variável pelas funções do R
74
Fatores economizam memória
Nominal:milsa$fatorcivil=factor(milsa$civil, ordered=F)
$fatorcivil : Factor w/ 2 levels
"casado","solteiro": 2 1 1 2 2 1 2 2 1 2
Ordinal:milsa$fatormes = factor(milsa$mes, ordered=T)
$fatormes : Ord.factor w/ 12 levels
"0"<"1"<"2"<"3"<..: 4 11 6 11 8 1 1 5 11 7 ...
75
É possível definir uma ordem específica: ?factor
De fator para texto:d.f$novaColuna =
as.character(d.f$colunaFator)
De fator para número:d.f$novaColuna =
as.numeric(
as.character(d.f$colunaFator))
76
A representação interna de um fator é diferente do seu texto
Para:m1 <- matrix(1:12, ncol = 3)
Soma das colunas (um valor para cada coluna):colSums(m1)
[1] 10 26 42
Ouapply(m1,2,sum)
[1] 10 26 42
77
Soma das linhas (um valor para cada linha):rowSums(m1)
[1] 15 18 21 24
Ouapply(m1,1,sum)
[1] 15 18 21 24
78
Posso usar qualquer função.
Até próprias
aggregate(salario ~ instrucao,
data = milsa, mean)
instrucao salario
1 1oGrau 7.836667
2 2oGrau 11.528333
3 Superior 16.475000
79
aggregate(
salario ~ instrucao + civil,
data = milsa, mean)
instrucao civil salario
1 1oGrau casado 7.044000
2 2oGrau casado 12.825000
3 Superior casado 17.783333
4 1oGrau solteiro 8.402857
5 2oGrau solteiro 8.935000
6 Superior solteiro 15.166667
80
modelo = lm(
formula = salario ~ ano + instrucao,
data = milsa)
summary(modelo)
81
É uma linha mesmo!!!