Olá! Esta é a primeira aula do curso Introdução ao R. Este material foi amplamente inspirado no curso homônimo do Rogério Barbosa e no curso Introduction to Statistical Learning with Applications in R de Trevor Hastie e Robert Tibshirani (livro disponibilizado pelos autores aqui). Vamos começar!

Comandos básicos

Podemos usar o R como calculadora:

5 + 5
## [1] 10
16-32
## [1] -16
7*5
## [1] 35
9/3
## [1] 3

Resto da divisão

10%%3
## [1] 1

Raiz e potência

A maioria dos comandos no R tem esse formato: função(). Para tirar a raiz usamos o comando sqrt()

sqrt(49)
## [1] 7
4^2
## [1] 16
5^5
## [1] 3125

Raiz cúbica

27^(1/3)
## [1] 3

Exponencial e log natural(base e)

exp(4.5)
## [1] 90.01713
log(90)
## [1] 4.49981

Linguagem de programação orientada a objetos

O R é uma linguagem de programação orientada a objetos. Em linguagem muito coloquial, isso quer dizer que podemos atribuir números, textos e resultados a um objeto criado. Vamos construir um objeto chamado x com o valor 5 e um objeto y com o valor 7:

x <- 5
y = 7
x
## [1] 5
y
## [1] 7

Podemos fazer também operações com objetos

x+y
## [1] 12
x*y
## [1] 35
z = 2*x + y^2
z
## [1] 59

Trabalhando com vetores

O comando c() significa concatenar, ou seja, juntar os valores. Vamos construir um objeto x e atribuir a ele um vetor de números:

x <- c(1,3,2,5)
x
## [1] 1 3 2 5

Se eu atribuir outro vetor ao objeto x, ele será sobrescrito.

x = c(1,6,2)
x
## [1] 1 6 2
y = c(1,4,3)
y
## [1] 1 4 3

Podemos verificar o tamanho do vetor com o comando length():

length(x)
## [1] 3
length(y)
## [1] 3

Operações com vetores

x+y
## [1]  2 10  5
x-y
## [1]  0  2 -1
x*y
## [1]  1 24  6
x/y
## [1] 1.0000000 1.5000000 0.6666667

Outros comandos úteis:

ls() #este comando lista os objetos no ambiente
## [1] "x" "y" "z"
rm(x,y) #este comando remove objetos
ls()
## [1] "z"
rm(list=ls()) # para limpar tudo no ambiente
ls()
## character(0)

Classes de vetores

Os vetores podem ser numéricos, inteiros, lógicos, ou character, isto é, vetores de texto.

Para descobrir a classe de um vetor, usamos o comando class()

numeros <- c(13,15,24,17,12)
nomes <- c("Neylson","Ítalo","Silvio","Rogério","Marcelo")

class(numeros) # vetor numérico
## [1] "numeric"
class(nomes) # vetor de texto ou string
## [1] "character"
inteiros <- c(5L, 7L, 45L, 9L, 2L)
class(inteiros) # vetor de números inteiros
## [1] "integer"
#podemos converter um vetor numérico para um vetor de inteiros
peso <- c(60.45, 78.9, 45.7, 98.654, 69.324)
class(peso)
## [1] "numeric"
as.integer(peso) 
## [1] 60 78 45 98 69

Trabalhando com vetores character (INTRO)

Uma função bastante útil para vetores numéricos é a paste(). Esta função junta os diversos componentes de um vetor separando-os com um espaço. Se quero que seja separada por outro elemento qualquer, uso a opção sep. A função paste0() não usa separador.

paste("Eu","gosto","de","pão","de","queijo!")
## [1] "Eu gosto de pão de queijo!"
paste("Eu","gosto","de","pão","de","queijo!", sep = "|")
## [1] "Eu|gosto|de|pão|de|queijo!"
paste0("Ês", "pens","cu","ons","é","dês") #Só os mineiros entenderão!
## [1] "Êspenscuonsédês"

Vetores Lógicos

Vetores lógicos assumem apenas dois valores: TRUE e FALSE. Eles são importantes para testes no R.

logicos <- c(T,F,F,T,T)
class(logicos)
## [1] "logical"
5 > 3   # 5 é maior que 3?
## [1] TRUE
5 > 6   # 5 é maior que 6?
## [1] FALSE
is.numeric(logicos) # o vetor "logicos" é numeric?
## [1] FALSE

Sequências

Sequências são bastante úteis em programação. Podemos criá-las de algumas maneiras no R:

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
4:40
##  [1]  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
## [24] 27 28 29 30 31 32 33 34 35 36 37 38 39 40
2.5:9
## [1] 2.5 3.5 4.5 5.5 6.5 7.5 8.5
7:-7
##  [1]  7  6  5  4  3  2  1  0 -1 -2 -3 -4 -5 -6 -7

A função seq() permite algumas opções mais elaboradas:

seq(from=15, to=30)
##  [1] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
seq(from=15, to=30, by=3)
## [1] 15 18 21 24 27 30
seq(from=15, to=30, by= 0.5)
##  [1] 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5 20.0 20.5 21.0 21.5
## [15] 22.0 22.5 23.0 23.5 24.0 24.5 25.0 25.5 26.0 26.5 27.0 27.5 28.0 28.5
## [29] 29.0 29.5 30.0
seq(from=15, to=30, length=10) #tamanho da sequência definida
##  [1] 15.00000 16.66667 18.33333 20.00000 21.66667 23.33333 25.00000
##  [8] 26.66667 28.33333 30.00000
seq(from=15, to=5, by=-.5)
##  [1] 15.0 14.5 14.0 13.5 13.0 12.5 12.0 11.5 11.0 10.5 10.0  9.5  9.0  8.5
## [15]  8.0  7.5  7.0  6.5  6.0  5.5  5.0

Podemos ainda criar repetições com a função rep():

rep(1:3, times=10)
##  [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
rep(1:3, each=10)
##  [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3

Missing data

No R o valor missing, ou não resposta é representado por NA.

x = c(1,3,NA,6,10)
x
## [1]  1  3 NA  6 10
class(x)
## [1] "numeric"
is.na(x) #No vetor x há um NA?
## [1] FALSE FALSE  TRUE FALSE FALSE
is.nan(x) #No vetor x há um NaN (not a number)?
## [1] FALSE FALSE FALSE FALSE FALSE

Veja bem que NaN (not a number) é um caso especial de missing values.

0/0
## [1] NaN
is.na(0/0)
## [1] TRUE
is.nan(0/0)
## [1] TRUE

Matrizes

Matrizes são objetos que assumem duas dimensões, ou seja, vetores organizados em linhas e colunas. As matrizes podem armazenar dados de apenas um tipo. Esta é uma característica importante para lembrarmos.

Podemos criar uma matriz no R com o comando matrix() e definindo o número de linhas e colunas:

matrix(1:40, nrow = 10, ncol = 4)
##       [,1] [,2] [,3] [,4]
##  [1,]    1   11   21   31
##  [2,]    2   12   22   32
##  [3,]    3   13   23   33
##  [4,]    4   14   24   34
##  [5,]    5   15   25   35
##  [6,]    6   16   26   36
##  [7,]    7   17   27   37
##  [8,]    8   18   28   38
##  [9,]    9   19   29   39
## [10,]   10   20   30   40
matrix(1:40, nrow = 10, ncol = 4, byrow = T)
##       [,1] [,2] [,3] [,4]
##  [1,]    1    2    3    4
##  [2,]    5    6    7    8
##  [3,]    9   10   11   12
##  [4,]   13   14   15   16
##  [5,]   17   18   19   20
##  [6,]   21   22   23   24
##  [7,]   25   26   27   28
##  [8,]   29   30   31   32
##  [9,]   33   34   35   36
## [10,]   37   38   39   40

Podemos também fazer operações com matrizes:

X <- matrix(21:40, 5, 4)
X
##      [,1] [,2] [,3] [,4]
## [1,]   21   26   31   36
## [2,]   22   27   32   37
## [3,]   23   28   33   38
## [4,]   24   29   34   39
## [5,]   25   30   35   40
class(X)
## [1] "matrix"
sqrt(X)
##          [,1]     [,2]     [,3]     [,4]
## [1,] 4.582576 5.099020 5.567764 6.000000
## [2,] 4.690416 5.196152 5.656854 6.082763
## [3,] 4.795832 5.291503 5.744563 6.164414
## [4,] 4.898979 5.385165 5.830952 6.244998
## [5,] 5.000000 5.477226 5.916080 6.324555
X^2
##      [,1] [,2] [,3] [,4]
## [1,]  441  676  961 1296
## [2,]  484  729 1024 1369
## [3,]  529  784 1089 1444
## [4,]  576  841 1156 1521
## [5,]  625  900 1225 1600

Para selecionar um elemento qualquer de uma matriz, usamos []:

X[10]
## [1] 30
class(X[10])
## [1] "integer"

Para selecionar por linhas e colunas use a fórmula [linha , coluna].

X[1,2]
## [1] 26
X[2,1]
## [1] 22
X[3,] # Linhas 3 inteira
## [1] 23 28 33 38
X[,4] # Coluna 4 inteira
## [1] 36 37 38 39 40

Para investigar as dimensões de uma matriz, usamos o comando dim(). nrow() e ncol() retornam o número de linhas e o número de colunas.

dim(X)
## [1] 5 4
nrow(X)
## [1] 5
ncol(X)
## [1] 4

Data Frames

Os data frames são os objetos do tipo banco de dados do R. Eles também são organizados em linhas e colunas mas, diferente das matrizes, os data frames podem conter colunas de diferentes classes. Uma coluna pode ser numeric, outra character e outra integer, por exemplo. Os data frames são, portanto, estruturas semelhantes aos bancos de dados convencionais usados em outros pacotes estatísticos como SPSS ou STATA onde as colunas são as variáveis e as linhas, os casos.

Podemos criar um banco de dados com o comando data.frame(). É necessário dizer ao R o nome das variáveis:

dados <- data.frame(Nomes=c("Antonio","Gilberto","Mauricio","Isabela"),
                   Profissoes=c("Video Maker","Comerciante","Bancario","Estudante"),
                   Cidades=c("Belo Horizonte","Sao Paulo","Belo Horizonte","Sao Paulo"),
                   Idades=c(65,50,67,19),
                   stringsAsFactors=F)
dados
##      Nomes  Profissoes        Cidades Idades
## 1  Antonio Video Maker Belo Horizonte     65
## 2 Gilberto Comerciante      Sao Paulo     50
## 3 Mauricio    Bancario Belo Horizonte     67
## 4  Isabela   Estudante      Sao Paulo     19

Podemos selecionar itens específicos de cada data frame de várias maneiras.

dados[4]
##   Idades
## 1     65
## 2     50
## 3     67
## 4     19
class(dados[4]) # retorna um data.frame
## [1] "data.frame"
class(dados[[4]]) # [[]] retorna um numeric
## [1] "numeric"
class(dados["Idades"]) # retorna um data.frame
## [1] "data.frame"
class(dados[["Idades"]]) # retorna um numeric
## [1] "numeric"
class(dados$Idades) # Usando o operador $ retorna sempre um numeric
## [1] "numeric"

Também podemos selecionar itens específicos de um data frame:

dados[2,4] # linha 2, coluna 4
## [1] 50
dados[3,1] # linha 3, coluna 1
## [1] "Mauricio"
dados[,2] # toda a coluna 2
## [1] "Video Maker" "Comerciante" "Bancario"    "Estudante"
dados[3,] # toda a linha 3
##      Nomes Profissoes        Cidades Idades
## 3 Mauricio   Bancario Belo Horizonte     67

Podemos combinar essas formas de selecao:

dados[["Idades"]][1]  #Primeiro elemento da variavel idade
## [1] 65
dados[["Idades"]][2:4]  # Elementos 2,3 e 4 da variavel idade
## [1] 50 67 19

Podemos ainda especificar critérios de seleção. Neste exemplo, vamos extrair todos os casos em que a pessoa tenha mais de 30 anos:

# dados fazendo subsetting pelas linhas em que a variável Idades seja maior que 30
dados[dados$Idades>30,]
##      Nomes  Profissoes        Cidades Idades
## 1  Antonio Video Maker Belo Horizonte     65
## 2 Gilberto Comerciante      Sao Paulo     50
## 3 Mauricio    Bancario Belo Horizonte     67

Para acrescentar novas informações aos bancos de dados, usamos os comandos rbind() para acrescentar linhas e cbind() para acrescentar colunas.

rbind(dados, data.frame(Nomes="Fernando",Profissoes="Bancario", Cidades="Belo Horizonte",Idades=28))
##      Nomes  Profissoes        Cidades Idades
## 1  Antonio Video Maker Belo Horizonte     65
## 2 Gilberto Comerciante      Sao Paulo     50
## 3 Mauricio    Bancario Belo Horizonte     67
## 4  Isabela   Estudante      Sao Paulo     19
## 5 Fernando    Bancario Belo Horizonte     28
cbind(dados, Time=c("Cruzeiro","Galo Doido","Cruzeiro","Galo Doido"))
##      Nomes  Profissoes        Cidades Idades       Time
## 1  Antonio Video Maker Belo Horizonte     65   Cruzeiro
## 2 Gilberto Comerciante      Sao Paulo     50 Galo Doido
## 3 Mauricio    Bancario Belo Horizonte     67   Cruzeiro
## 4  Isabela   Estudante      Sao Paulo     19 Galo Doido

Podemos ainda criar uma matriz ou um data frame com os comandos rbind() e cbind() a partir de vetores. Por exemplo:

pessoas = c("Neylson","Ítalo","Vicky","Mel","Leonardo")
idades = c(29, 23, 21, 49, 27)
grupos_pesquisa = c("GIARS","GIARS","GIARS","CPEQS","CPEQS")
colegas <- cbind(pessoas, idades, grupos_pesquisa)
colegas
##      pessoas    idades grupos_pesquisa
## [1,] "Neylson"  "29"   "GIARS"        
## [2,] "Ítalo"    "23"   "GIARS"        
## [3,] "Vicky"    "21"   "GIARS"        
## [4,] "Mel"      "49"   "CPEQS"        
## [5,] "Leonardo" "27"   "CPEQS"
class(colegas)
## [1] "matrix"
sapply(colegas, class) # aplica a função class para cada elemento da matriz
##     Neylson       Ítalo       Vicky         Mel    Leonardo          29 
## "character" "character" "character" "character" "character" "character" 
##          23          21          49          27       GIARS       GIARS 
## "character" "character" "character" "character" "character" "character" 
##       GIARS       CPEQS       CPEQS 
## "character" "character" "character"
colegas <- cbind.data.frame(pessoas, idades, grupos_pesquisa)
colegas
##    pessoas idades grupos_pesquisa
## 1  Neylson     29           GIARS
## 2    Ítalo     23           GIARS
## 3    Vicky     21           GIARS
## 4      Mel     49           CPEQS
## 5 Leonardo     27           CPEQS
class(colegas)
## [1] "data.frame"
sapply(colegas, class) # aplica a função class para cada elemento do data.frame (colunas)
##         pessoas          idades grupos_pesquisa 
##        "factor"       "numeric"        "factor"

Listas

Uma lista é uma classe de objetos mais complexa do que o data frame porque pode conter quaisquer outras classes em sua composição. Podemos montar uma lista com um vetor numérico, um vetor character, uma matriz e um data.frame:

lista <- list(numerico=c(4,6,78,9.5,3.465,1098), vetor_character=c("Márcio", "Cléber"),
              matriz=matrix(101:200, 20, 5), 
              bd = data.frame(nomes=c("César", "Daniel","Cecília"),
                         idades=c(19,22,24),
                         raca=c("Branco","Pardo","Preto"), stringsAsFactors = F))
lista
## $numerico
## [1]    4.000    6.000   78.000    9.500    3.465 1098.000
## 
## $vetor_character
## [1] "Márcio" "Cléber"
## 
## $matriz
##       [,1] [,2] [,3] [,4] [,5]
##  [1,]  101  121  141  161  181
##  [2,]  102  122  142  162  182
##  [3,]  103  123  143  163  183
##  [4,]  104  124  144  164  184
##  [5,]  105  125  145  165  185
##  [6,]  106  126  146  166  186
##  [7,]  107  127  147  167  187
##  [8,]  108  128  148  168  188
##  [9,]  109  129  149  169  189
## [10,]  110  130  150  170  190
## [11,]  111  131  151  171  191
## [12,]  112  132  152  172  192
## [13,]  113  133  153  173  193
## [14,]  114  134  154  174  194
## [15,]  115  135  155  175  195
## [16,]  116  136  156  176  196
## [17,]  117  137  157  177  197
## [18,]  118  138  158  178  198
## [19,]  119  139  159  179  199
## [20,]  120  140  160  180  200
## 
## $bd
##     nomes idades   raca
## 1   César     19 Branco
## 2  Daniel     22  Pardo
## 3 Cecília     24  Preto

Podemos fazer subsetting com listas do mesmo modo que fazemos com data frames:

# Com colchetes simples
class(lista[3])
## [1] "list"
class(lista["matriz"])
## [1] "list"
# Com colchetes duplas
class(lista[[3]])
## [1] "matrix"
class(lista[["matriz"]])
## [1] "matrix"
# Subsettings mais precisos
class(lista[[4]][2,1])
## [1] "character"