Minicurso introdutório ao R

Marcelo (mcruas@gmail.com)
21/10/2013

Objetivos do curso

  • Se familiarizar com uma linguagem de programação procedural
  • Aprender comandos básicos do R
  • Conseguir analisar bases de dados
  • Criar uma função própria
  • Fazer isso utilizando boas práticas de programação

Objetivos do dia

LIBERAR SEU NERD INTERIOR

alt text

Sobre o R

  • Programação científica
  • Rapidez de programação vs. Rapidez de performance
  • Otimizado para operações com matrizes e vetores
  • O R puro é programado somente por linha de comando, MAS existem ambientes para facilitar a programação
  • Livros disponíveis sobre o R: http://www.r-project.org/doc/bib/R-books.html

Sobre o RStudio

alt text

Instalando o R e o RStudio

  1. Abra o navegador
  2. Coloque “R download” no google
  3. Instale o R
  4. Coloque “RStudio download” no google
  5. Instale o RStudio (no computador da UFRGS é necessário instalar a versão Zip/Tarball)

RStudio vs. Matlab


Critério R Matlab Peso do critério
Funções de otimização 0 X 1
Funções de estatística X 0 1
É grátis? X 0 1000
Resultado final 1001 1


alt text

Comandos Básicos

alt text

Expressões

O R sabe somar

1+1 #euamomatemática

O R sabe fazer operações mais complexas

7*(6+827.3)

Strings devem ser usados entre “” para diferenciar de nome de variável

curso.de.r <- "I’ve got a very bad feeling about this!"

Expressões

  • As expressões usuais, como \( + - * / ^ \) são todas implementadas no R

  • Não esquecer a precedência dos parênteses

  • Outras operações aritméticas:

18 %% 4 # o resultado é o resto da divisão
83.5 %/% 4 # o resultado é a parte inteira da divisão

Valores lógicos

Comparação de valores gera um resultado binário (TRUE ou FALSE)

3.141592653589 < pi
[1] TRUE
"RS" > "Brazil"
[1] TRUE

Operadores lógicos

Igual ==

Menor <

Não x !x

x E y x&y

Diferente !=

Menor ou igual <=

x OU y x|y

alt text

Operadores lógicos - Exercício


O que acontece se utilizarmos operadores lógicos com números ou strings?

alt text

Variáveis

  • Podem armazenar um valor para usar depois.
  • Funciona com números, matrizes, strings, valores lógicos, etc.
x <- -13
y <- 17
z <- sqrt(x + y) # sqrt() é a raiz quadrada do valor entre parêntesis
  • Para exibir os valores de uma variável, basta digitar o nome das variáveis no console
z
[1] 2

Variáveis

  • De acordo com as práticas de boa programação, disponíveis aqui, se recomenda o uso do símbolo <- para atribuição de valores para variáveis.
  • Também é possível fazer atribuições utilizando o símbolo =, embora não recomendado

Funções

Uma função é chamada através de seu nome, seguida dos parâmetros entre parêntesis

sum(1,2,10,832)
[1] 845

Alguns argumentos possuem nomes

rep("Aaaaah le leki leki leki", times=5)
[1] "Aaaaah le leki leki leki" "Aaaaah le leki leki leki"
[3] "Aaaaah le leki leki leki" "Aaaaah le leki leki leki"
[5] "Aaaaah le leki leki leki"

Funções

Outras funções para testar:

  • Exp()
exp(2) 
  • Help()
help(max) # Ajuda sobre alguma função
  • Example()
example(matrix) # Dá exemplos sobre a utilização da função

Vetores

alt text

Vetores

Vetores são criados a partir da função c(), originado da expressão Combine

v <- c(1,2,3)

Um vetor pode conter valores numéricos, lógicos, etc.

c(TRUE,FALSE,FALSE,TRUE)
c("o que","eh isso","novinho","!")

O que acontece ao misturar diferentes tipos num vetor?

c(99,"baloes vermelhos",TRUE)

Vetores

x <- c(49,42,40)
x
[1] 49 42 40
x + 10
[1] 59 52 50
x/2
[1] 24.5 21.0 20.0

Vetores

Vetores podem ser somados diretamente: \[ x=\left[\begin{array}{c} 1\\ 2\\ 3 \end{array}\right]+\left[\begin{array}{c} 4\\ 5\\ 6 \end{array}\right] \]

x <- c(1,2,3) + c(4,5,6)

Cuidado com diferença de dimensões!

c(1,2,3,7,8,9) + c(4,5,6)
[1]  5  7  9 11 13 15

Vetores

Vetor sequência

7:20

A função seq() permite incrementos diferentes de 1

seq(2,28,by=5)

Vetores

Testando a igualdade entre vetores

y <- c(5,27,9)
x == y
[1]  TRUE FALSE  TRUE

Nota-se que o R não verifica se os vetores são iguais, mas sim se cada elemento é igual ou não.

Testando se os vetores são matematicamente iguais à moda Miguelão

sum((x-y)^2)
[1] 400

Vetores

É possível comparar os valores de um vetor com alguma constante

x == 5
[1]  TRUE FALSE FALSE

Como exercício, agora, calcule quais valores de sin(x) são menores do que zero

sin(x) < 0

obs: aplicar uma função cujo argumento seja um escalar num vetor faz com que ela seja aplicada em cada elemento do vetor

Vetores

v <- c(1,2,3)

É possível nomear os elementos de um vetor

names(v) <- c("x","y","z")
v["y"]

Vetores - Aritmética

Operações de \( +-/* \) para vetores funcionam termo a termo

Para fazer operações vetoriais, há operações próprias:

  • Produto escalar: v1 %*% v2
  • Transpor o vetor: t(v1)

Vetores - Acessando valores

x <- c(49,42,40)

Para acessar o primeiro e último valores de \( x \)

x[1]

x[length(x)] # length(v) fornece o tamanho do vetor v
x[c(1,3)] # Acessa mais de um valor

x <- x[-2] # retira o segundo elemento do vetor

Vetores - Exercícios

\[ vetorao=\begin{bmatrix}1\\ \vdots\\ 15\\ 0\\ \vdots\\ 0\\ 16\\ 17 \end{bmatrix} \]

A expressão

length(vetorao) == 1000

deve ser verdadeira.

Vetores - Exercícios

vetorao <- c(1:15,rep(0,(1000-17)),16,17)
length(vetorao)
[1] 1000
mean(vetorao)
[1] 0.153
max(vetorao)
[1] 17
vetorao[vetorao == 0] <- 1

Vetores - Gráficos

x <- c(1,1,1,0,1,1)
barplot(x)

plot of chunk unnamed-chunk-34

Atualize o nome das variáveis e exiba o gráfico novamente

names(x) <- 2007:2012
barplot(x)
title("Título do gráfico")

Vetores - Gráficos

plot of chunk unnamed-chunk-38

Vetores - Gráficos

Defina \( x \) como uma sequência \( 1,1.1,1.2,...,9.9,10 \). Após, defina \( y=sin(x) \) e exiba um gráfico através do comando plot(x,y)

x <- seq(1, 20, 0.1)
y <- sin(x)
plot(x,y)

plot of chunk unnamed-chunk-40

Matrizes

Matrizes

Para criar uma matriz, pode-se utilizar a função matrix()

help(matrix)

alt text

Matrizes

matrix(1,3,7) # criando uma matriz com o valor 1, com 4 linhas e 7 colunas
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    1    1    1    1    1    1
[2,]    1    1    1    1    1    1    1
[3,]    1    1    1    1    1    1    1

Quando só há um elemento nos dados, ele é repetido por todos os elementos da matriz

Matrizes

v <- 1:10
matrix(v,3,7) # pode-se também criar a matriz com um vetor como seu argumento
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    4    7   10    3    6    9
[2,]    2    5    8    1    4    7   10
[3,]    3    6    9    2    5    8    1

Observe a diferença quando se coloca byrow=TRUE

matrix(v,3,7,byrow=TRUE)

Matrizes

Outra forma de criar uma matriz a partir de um vetor é ajustando suas dimensões explicitamente

dim(v) <- c(3,4) # Essa expressão dará erro. Interprete o erro e faça alguma mudança para criar uma matriz a partir dos elementos de v.
dim(v) <- c(2,5)

Matrizes


Pode-se montar uma matriz a partir de vetores

cbind(c(1,2,3),c(4,5,6))
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

Qual a diferença entre utilizar a função cbind() e rbind()?

rbind(c(1,2,3),c(4,5,6))

Matrizes - Operações

A + B # soma de matrizes
A * B # produto dos elementos das matrizes
A %*% B # multiplicação de matrizes
crossprod(A,B) # equivalente a t(A) %*% B
crossprod(A) # equivalente a t(A) %*% A
  • Execute as duas operações e veja a diferença entre elas?
A %*% v
A * v

Matrizes - Operações

Resolvendo um sistema linear da forma \( Ax=b \)

x <- solve(A,b)

Usando a função solve() com apenas uma matriz como argumento retornará \( A^{-1} \)

A.inv  <- solve(A) 
det(A) # calcula a determinante
diag(v,3) # cria uma matriz 3x3 com os elementos de v na diagonal principal
diag(A) # retira os elementos da diagonal principal da matriz A

Matrizes - Acessando valores

Crie uma matriz qualquer, com dimensões maiores que 3 e com valores distintos

A <- matrix(v, n.colunas, n.linhas)
A[1, 2] # exibe o segundo elemento da primeira linha
A[, 1] # o que faz esse comando?
A[3, ] # e esse?

No lugar dos índices, pode-se usar variáveis para indicar qual linha e coluna se está acessando.

coluna <- 4
linha <- 4
A[linha,coluna]

E para várias (mas não todas colunas), como fazer a consulta?

Matrizes - Gráficos

A <- matrix(1,5,5)
A[1,3] <- 0
A[2,4] <- 0
A[2,1] <- 3
contour(A)

plot of chunk unnamed-chunk-61

Matrizes - Gráficos

Ou em 3D! :D

persp(A)

plot of chunk unnamed-chunk-63

Bom, às vezes o resultado não é dos melhores…

Matrizes - Gráficos

O R possui algumas bases de dados já disponíveis para testes

contour(volcano) # exibe as curvas de nível do vulcão
image(volcano) # exibe um gráfico de calor

Matrizes - Gráficos

O R possui algumas bases de dados já disponíveis para testes

contour(volcano)

plot of chunk unnamed-chunk-65

De onde é esse vulcão?

Manipulação de dados

alt text

Data Frame

É um outro tipo de dado, composto por uma lista de vetores de mesmo tamanho

nomes  <-  c("Heliveuton", "Micajequisson","Marcelo")
salario <- c(7000,50000,1500)
idade <- c(17,21,18)
individuos <- data.frame(nomes,salario,idade)
individuos
          nomes salario idade
1    Heliveuton    7000    17
2 Micajequisson   50000    21
3       Marcelo    1500    18

Ordenando os dados

order(individuos$salario) # mostra qual o índice do menor valor, depois do segundo menor, etc.
[1] 3 1 2

Como exibir os individuos por ordem crescente de salário?

individuos[order(individuos$salario), ]
          nomes salario idade
3       Marcelo    1500    18
1    Heliveuton    7000    17
2 Micajequisson   50000    21

Arquivos

Arquivos - Leitura

  • Baixe os arquivo dados_co2.csv e dados_populacao.csv de www.is.gd/cursoR
  • O R deve saber qual sua pasta de trabalho
  • O RStudio facilita as coisas: Session -> Set Working Directory
dados <- read.csv(file=nome.do.arquivo, header=TRUE) # carrega os dados em toneladas de CO2 emitido per capita. Para nome.do.arquivo, coloque o nome dele entre ""
  • Usar o argumento header=TRUE indica que a primeira linha do arquivo contém o nome das variáveis

Arquivos - Leitura

O R pode ler também base de dados de STATA, SPSS, etc. Para isso, basta carregar o pacote foreign

library(foreign)
wages <- read.dta(file="wages.dta")

Para escrever de volta num arquivo

write.csv(A, file = "saida.csv", row.names = FALSE)

Arquivos

Após abrir as bases de dados, é preciso saber qual sua estrutura. O R fornece algumas funções para isso

str(dados)
summary(dados)
head(dados)

Há varios outros pacotes que podem ser baixados para análise semelhante. Abra a aba de pacotes e instale o pacote psych

describe(dados)

Juntando dados

Muitas vezes, precisamos juntar dados de diferentes tabelas. Para isso, utiliza-se a função merge()

?merge

Experimente com os arquivos disponíveis baixados anteriormente

Exercício

  1. Com os dados da população e das emissões de CO2 per capita, utilize o comando merge() para unir as duas bases de dados
  2. Calcule as emissões TOTAIS dos países no último ano disponível
  3. Crie um arquivo chamado emissoes_totais.csv, com duas colunas: o nome do país (não o código) e as emissões totais. Os países devem estar listados em ordem descrescente das emissões
  4. Crie um gráfico com as emissões per capita de um país à sua escolha entre 1960 e 2010, com legendas

Bônus

  • Criar um arquivo R Markup com as respostas do exercício e publicar na web!
  • Antes, precisa baixar o pacote knitr
  • File -> New File -> R Markdown
  • Leia a ajuda em Help -> Markdown Quick Reference
  • Publique no RPubs

… complete your training is not!

alt text