## Objetivos:
## - Apresentar os recursos gráficos básicos do R
## - Gerenciamento básico de pacotes
## - Documentação e ajuda
## - Operadores
## - Funções elementares
## - Estruturas de dados
## - Estruturas de controle de fluxo
## - Funções
## Alguns exemplos dos recursos gráficos básicos do R
demo(graphics,
echo=FALSE,
ask=TRUE) # Recursos gráficos genéricos
demo() # Lista os demos dos pacotes carregados na sessão
## Lista os demos de todos os pacotes instalados (carregados ou não)
demo(package=.packages(all.available=TRUE))
## Gerenciamento básico de pacotes
## Listar os pacotes em uso na sessão
search()
## Carregar um pacote já instalado no computador para uso
library(AER) # Applied Econometrics with R, Springer-Verlag, New York. ISBN 978-0-387-77316-2.
search()
## Instalar e carregar um pacote
install.packages('rgl')
library(rgl)
search()
## Dois demos do pacote rgl
demo(abundance,
echo=F,
ask=F) # Recursos gráficos 3D dinâmico (interagir com o mouse)
demo(bivar,
echo=F) # Recursos gráficos 3D dinâmico (interagir com o mouse)
## Atualizar todos os pacotes (deve ser feito periódicamente)
update.packages(ask=FALSE)
## Remover um pacote do caminho de busca da sessão
detach(package:rgl)
search()
## Remover (do computador) um pacote não mais necessário
remove.packages('rgl')
library(rgl) # Verificar mensagem de erro
##===================================================================
## Documentação e ajuda
##===================================================================
?round
?'for' # ou ?"for"
?'[[' # ou ?"[["
apropos('mea')
apropos('^mea') # Expressão regular
apropos('^mea',
ignore.case=F) # Expressão regular
help.search('mea')
help.start() # ou menu 'Help/Html help
vignette() # Documentos em pdf (dependente dos pacotes instalados)
vignette('grid') # Abre pdf relacionado ao pacote grid
# install.packages('sos')
library(sos)
findFn('biplot')
##===================================================================
## Operadores
##===================================================================
## Aritiméticos
##---------------------
## Operador Descrição
##---------------------
## + adição
## - subtração
## * multiplicação
## / divisião
## ^ or ** exponenciação
## x %% y verifica se a divisão é exata (módulo)
## x %/% y divisão inteira
1 + 2
4 - 2
2 * 3
5 / 2
2^3
2 ** 3
4 %% 2 # exata = 0
5 %% 2 # não exata = 1
5 %/% 2 # apenas a parte inteira da divisão
## Lógicos
##---------------------
## Operador Descrição
##---------------------
## < menor que
## <= menor ou igual que
## > maior que
## >= maior ou igual que
## == exatamente igual
## != não igual a
## !x não x
## x | y x ou y
## x & y x e y
2 < 1
2 <= 1
2 <= 2
1 > 2
1 != 1
1 != 2
!TRUE
(x <- 1:10)
x[(x < 3) | (x > 8)]
x[(x < 5) & (x > 5)]
x[(x <= 5) & (x >= 5)]
## Atribuição
##---------------------
## Operador Descrição
##---------------------
## <- recebe valor
## -> atribui valor
## = atribui valor
(x <- 1)
(2 -> x)
(x = 2)
## Extração e atribuição
##---------------------
## Operador Descrição
##---------------------
## [] usado em: vetor, matrix, array, frame e lista
## [[]] usado em: vetor, matrix, array, frame e lista
## $ usado em: frame, lista
## Extração
(x <- 1:10)
x[6]
x[c(1:2, 9:10)]
x[x >= 8]
(L <- list(x=c(4, 6, 8),
y=TRUE,
z=letters[1:6]))
L[1]
L[1] / 2 # erro proposital
L[[1]]
L[[1]] / 2
L$z[1:3]
L$z[c(1:2, 6)]
str(iris) # iris: conjunto de dados do pacote datasets
iris$Species
table(iris$Species)
## Atribuição
x[5] <- 999; x
L[1] <- NULL; L
## Definindo operadores próprios
## são funções com dois argumentos cujo nome começa e as extremidades em %
'%mop%' <- function(x, y) x * y
100 %mop% (1:10)
##===================================================================
## Algumas funções elementares
##===================================================================
## set.seed: Semente para poder reproduzir instruções aleatórias
## (runif nesse caso) sempre que necessário
set.seed(25)
(x <- round(runif(n=20,
min=0,
max=10),
digits=2))
length(x) # Número de elementos
min(x)
max(x)
sort(x)
sort(x,
dec=T)
median(x) # Mediana
mean(x) # Média
var(x) # Variância
sd(x) # Desvio padrão (standard deviation)
sqrt(var(x)) # Desvio padrão
sum(x) # Somatório
round(x)
round(x,
digits=1)
## Returns Tukey's five number summary
fivenum(x) # minimum, lower-hinge, median, upper-hinge, maximum
## Comparando resultados
fivenum(x) == quantile(x)
fivenum(x) == quantile(x,
type=5)
## Quantil arbitrário
quantile(x,
c(0, .33, .66, 1))
1:10
cumsum(1:10)
cumprod(1:10)
## Imprimir no console uma mensagem ou o valor de uma variável
print('Teste:')
x <- 10
x
print(x)
## Concatenação:
#cat('\nValor de x =',
# x)
#
#cat('\nValor de x =',
# x); cat('\n')
#
#cat('\n\tValor de x =',
# x); cat('\n')
##===================================================================
## Estruturas de dados: MUITO IMPORTANTE!!!
##===================================================================
##===============
## Vetores
##===============
## Algumas das diversas formas de criar:
c(1, 2, 3, 4, 5)
1:6
seq(from=1,
to=10,
by=1)
seq(1,
2,
length=10)
letters[1:5]
LETTERS[1:5]
c(a=1, b=5, c=10)
## Algumas formas de indexar:
(x <- seq(1, 10, by=1))
x[5:10]
x[c(5, 7:10)]
x[-(5:10)]
x > 5
x[x > 5]
x[x <= 6]
## Dar nomes aos componentes de um vetor:
names(x)
names(x) <- letters[1:length(x)]
x
x['b']
## Algumas operações básicas:
set.seed(3)
x <- round(runif(5,
0,
10),
d=1)
x
names(x) <- letters[1:length(x)]
x
x/2
x*2
x+10
sort(x)
sort(x,
dec=T)
rev(sort(x)) # idem anterior
set.seed(16)
(x <- sample(1:5,
10,
replace=T)) # Entre parênteses atribui e mostra
sort(x)
unique(x)
##===============
## Matrizes
##===============
(m <- matrix(c(1, 2, 3, 4),
nrow=2))
m[1,2]
## O produto matricial:
(x <- matrix(c(6, 7),
nrow=2))
m %*% x
## O determinante de uma matriz:
det(m)
## A transposta de uma matriz:
t(m)
## Uma matriz diagonal:
diag(c(1,2))
## A identidade da matriz:
diag(x=10,
nrow=2)
diag(nrow=2)
diag(rep(1, 3))
diag(2)
## Comandos cbind e o rbind para criar matrizes:
cbind(c(1, 2),
c(3, 4))
rbind(c(1, 3),
c(2, 4))
## O traço de uma matriz:
sum(diag(m))
## A inversa de uma matriz:
solve(m)
solve(m, x) # solução de sistemas lineares
solve(m) %*% x # ídem
##===============
## Arrays
##===============
## 2 linhas, 4 colunas, 3 dimensões
(ar <- array(letters[1:24],
c(2, 4, 3)))
class(ar)
ar[1,1,1] # ar[linha, coluna, dimensão] -> ar(x, y, z)
ar[1,1,2]
ar[1,2,3]
class(iris3) # iris3: array localizado no pacote datasets
iris3
##===============
## Fatores
##===============
set.seed(218)
(x <- factor(sample(c('a', 'b', 'c'),
5,
replace=T)))
class(x)
(l <- c('d', 'e', 'f'))
class(l)
levels(l) # observar a diferenças de fator!
set.seed(17)
(x <- factor(sample(l,
5,
rep=T)))
levels(x)
## Pode-se preferir uma tabela:
table(x)
## Se os valores estão de acordo com alguma razão, pode-se gerar níveis:
gl(n=1,
k=4)
gl(2, 4)
gl(2, 4,
labels=c(T, F))
gl(n=2,
k=1,
length=8)
gl(2, 1, 8,
labels=c(T, F))
## Pode fazer o produto cartesiano de dois fatores:
(x <- gl(2, 4))
(y <- gl(2,
1,
length=8))
interaction(x, y)
## O comando expand.grid é comparável (ele produz um frame), sendo muito útil
## para a geração de níveis de fatores para as matrizes provenientes de dados
## experimentais:
a <- c('a1', 'a2', 'a3')
b <- c('b1', 'b2')
c <- c('c1', 'c2')
dad <- expand.grid(a, b, c)
names(dad) <- c('A', 'B', 'C')
dad
##===============
## Frames
##===============
set.seed(17)
dF <- data.frame(x=rnorm(10,
m=10,
s=2),
y=sample(c(T, F),
10,
replace=T))
dF
## O comando str informa (retorna) a estrutura de um objeto e a parte dos dados
## que contém:
str(dF)
## A instrução 'summary' sumariza um objeto (aqui, um frame, mas vai bem com
## quase todos objetos):
summary(dF)
## Pode-se ter acesso aos dados das colunas de diversas maneiras:
dF
dF$x
dF[,1]
dF[['x']]
dim(dF)
names(dF)
row.names(dF)
## Pode-se mudar o nome das linhas ou das colunas:
dF
names(dF) <- LETTERS[1:ncol(dF)]
row.names(dF) <- letters[1:nrow(dF)]
dF
## Pode-se ter acesso direto as colunas de um frame usando o comando attach().
## Obs: Não deve esquecer-se de destacá-lo detach() quando terminar!
attach(dF)
table(A)
table(B)
detach(dF) # Nunca esqueça do detach após um attach!!!
## Opção melhor!
with(dF,
{
table(A)
table(B)
})
## Seleção de data.frames pelo valor das colunas
dF
subset(dF,
sub=(A > 10))
subset(dF,
sub=(B == TRUE))
subset(dF,
sub=(A > 10) & (B == TRUE))
## Ordenando um data.frame pelo valores de uma coluna
dF
(ord <- order(dF$A))
dF[ord, ]
dF2 <- dF[ord, ]
dF2
##===============
## Listas
##===============
## Gerando listas
l1 <- list()
l1[['foo']] <- 1
l1[['bar']] <- c('a', 'b', 'c')
str(l1)
l2 <- list(s1=iris,
s2=airquality,
s3=1:10,
s4=matrix(1:12,
nr=3,
nc=4))
str(l2)
## Indexando listas
l1
l1[['bar']] <- NULL
str(l1)
l1
## Exemplo, os parâmetros gráficos são armazenados em uma lista
str(par()) # a função par abre um novo dispositivo gráfico
## Indexando
l2$s3[l2$s3 >= 5 & l2$s3 < 9]
l2['s4']
l2[['s4']]
length(l2['s4']) # Observar a diferença com abaixo
length(l2[['s4']]) # Observar a diferença com acima
l2$s4
l2$s4[, 1:2]
l2$s4
l2$s4[1, 4]
l2$s4[, 4]
##===============================
## apply, tapply, lapply, sapply
##===============================
## O comando apply torna possível aplicar uma função (para o exemplo, a média)
## a cada coluna (ou linha) de um frame (ou de uma matriz):
(dF <- data.frame(x=1:10,
y=1:10,
z=1:10))
## Marginal nas linhas
apply(dF,
1,
mean)
apply(dF,
1,
sd)
## Marginal nas colunas
apply(dF,
2,
mean)
apply(dF,
2,
var)
## Em dimensões mais elevadas:
(m <- array(1:24,
dim=c(4, 3, 2)))
apply(m,
1,
mean)
mean(c( 1, 5, 9,
13, 17, 21)) # Observe!
apply(m,
c(1, 2),
mean)
mean(c(1, 13)) # Observe!
## A função tapply permite reagrupar as observações de acordo com o valor dos
## fatores e uma função (média, soma, etc..) para cada grupo obtido:
tapply(1:10,
gl(2, 5),
mean)
tapply(1:10,
gl(2, 5),
sum)
by(1:10,
gl(2, 5),
mean)
by(1:10,
gl(2, 5),
sum)
## A função sapply aplica a cada elemento de uma lista (ou de um vetor, etc..) e
## se possível retorna um vetor:
set.seed(2012)
x <- list(a=rnorm(10),
b=runif(100),
c=rgamma(50, 1))
sapply(x, sd)
## A função lapply faz a mesma coisa, mas retorna uma lista:
lapply(x, sd)
##===============================================================================
## Estruturas de controle
##===============================================================================
set.seed(15)
(x <- round(rnorm(10)))
(y <- ifelse(x > 0,
1,
-1))
(z <- ifelse(x > 0,
1,
ifelse(x < 0,
'< zero',
0)))
##===============
## Conexão:
##===============
x <- 'a'
y <- switch(x,
a='Bonjour',
b='Gutten Tag',
c='Hello',
d='Konnichi wa')
y
##===============
## Loop for:
##===============
for (i in 1:10)
print(i)
for (i in 2:9)
ifelse (i <= 5,
print(i),
print(paste(i,
'5',
sep=' > ')))
##===============
## Loop while:
##===============
a <- 0
while (a < 11) {
if (a >= 3)
print(a)
else
cat('não\n')
a <- a + 1 # Expressão avaliada..
}
##===============
## Loop repeat:
##===============
a <- 0
repeat {
a <- a + 1
if (a >= 3)
print(a)
else
cat('não\n')
if (a == 10) break
}
##===============================================================================
## Funções
##===============================================================================
f <- function(x) x/10 + 1
f(x=10)
f(10) # Chamada alternativa
f <- function(x) {
x/10 + 1
}
f(x=10)
f(10) # Chamada alternativa
## Pode atribuir valores aos argumentos:
f <- function(x, y=3) {
x/10 + 1 - y
}
f(10)
## Na chamada da função, pode-se usar o nome dos argumentos, passar novos valores
## para as variáveis, não sendo necessário que os mesmos sigam a ordem declarada
## na função (desde que os valores sejam acompanhados dos respectivos nomes):
f(y=1, x=10)
f <- function(x, y) {
x/10 + 1 - y
}
f(1, 10)
f(10, 1)
## No fim dos argumentos, pode haver três pontos, representando todos os
## argumentos não especificados:
f <- function(x,
y,
cex1=1,
cex2=3, ...) {
par(mfrow=c(2,1))
plot(x, cex=cex1, ...)
plot(y, cex=cex2, ...)
}
Meu nome é Miklos Bajay, consultor sênior especializado em assessoria estatística para artigos científicos, trabalhos de conclusão de curso, dissertações de mestrado e teses de doutorados. Se você estiver precisando de apoio técnico para análise estatística do seu trabalho acadêmico, elaboramos um relatório estatístico, a partir da sua base de dados, com todas as análises descritivas, tabelas, gráficos, testes e modelos estatísticos utilizados para resolução do seu problema de pesquisa.
Introdução ao R e programação
Marcadores:
Introdução