Capítulo 3 R!

A linguagem R pode ser usada desde uma simples calculadora até uma poderosa ferramenta estatística, seja para análise de dados, seja para machine learning.

Nesse capítulo veremos o básico da linguagem. Como a ideia é cobrir o máximo de conteúdo possível, passaremos bem rápido pelos conceitos básicos, com alguns exercícios para melhor entendimento.

3.1 Variáveis Básicas

Podemos armazenar valores, strings ou operadores lógicos nas chamadas variáveis básicas. É com elas que podemos fazer operações básicas e transformar o RStudio em uma calculadora superpoderosa. Existem 5 tipos de variáveis básicas, sendo elas:

  • Numeric (1): valores numéricos com ou sem casa decimal
5+2.3
## [1] 7.3
pi
## [1] 3.141593
  • Character (a): com eles podemos armazenar strings, como o título de um gráfico
titulo <- "Isso é uma string"
titulo
## [1] "Isso é uma string"
  • Integer (1): são valores inteiros

  • Complex (0+1i): também é possível armazenar valores complexos nas variáveis básicas

3 + 4i
## [1] 3+4i
  • Logical (TRUE): são os famosos operadores Booleanos, que permitem realizar comparações entre variáveis ou dados (Você não pode criar uma variável com os nomes TRUE ou FALSE, esses nomes são reservados pelo R)
1 == 2
## [1] FALSE

3.2 Vetores

Vetores permitem que você armazene dados em uma sequência 1D de qualquer um dos tipos listados nas variáveis básicas, mais o formato “cru” (raw) que é o modo de armazenamento de bytes. Por exemplo:

  • c(“A”, “C”, “D”)
  • 1:5 = c(1, 2, 3, 4, 5)
  • c(TRUE, FALSE)
  • c(1i, -1i)

Importante: ao contrário do C ou do Python, na linguagem R, a contagem das posições dos vetores começa do 1 e NÃO do zero!

3.3 Classe

Como foi possível notar, todas as variáveis pertencem a alguma classe, dessa forma, a função class permite descobrir qual a classe da variável que se está utilizando:

x <- c(1,2,3)
class(x)
## [1] "numeric"

Exercício: Qual a classe dos seguintes vetores?

c(1, “C”, “D”)
c(1, NA, “D”)
c(1, NA, NaN)


3.4 Converter objetos

Às vezes quando trabalhamos com dados, podemos precisar “arredondar” valores ou converter vetores em listas, para isso existem algumas funções especiais.

3.4.1 as

Um modo de forçar um objeto a assumir outra classe é por meio da função as:

as.integer(c(1.5, 2.9, 1))
## [1] 1 2 1

Note que a função apenas converte os números de decimais para inteiros, sem arredondar para o número mais próximo.


Pergunta: O que acontece quando se tenta converter o seguinte vetor?

as.numeric(c(1, "C", "D"))


3.4.2 merge e melt

Nem sempre os conjuntos de dados que você encontrar pela vida estarão no formato desejado para plotar e/ou analisar estatisticamente, dessa forma, essas duas funções poderão ajudar na sua jornada:

  • merge: permite a união entre dois data frames, seja por colunas em comum ou linhas em comum
  • melt: do pacote reshape2, permite que você agrupe várias colunas em função de outra coluna em comum, de acordo com o nome especificado

3.5 Array

Ao contrário do vetor unidimensional, arrays permietm que você armazene dados em diversas dimensões, sendo todas com o mesmo comprimento.

Vamos dar uma olhada nos argumentos da função:

args(array)
## function (data = NA, dim = length(data), dimnames = NULL) 
## NULL

Dessa forma, é preciso “informar” ao R qual o número de dimensões que você quer no seu array:

a <- array(data = 0, dim = c(1,1))
class(a)
## [1] "matrix"

No caso acima, como só foram desiginadas duas dimensões, o array é igual a uma matriz.

a <- array(data = 0, dim = c(3,3,1))
class(a)
## [1] "array"

Como dá pra ver acima, é possível armazenar diversos elementos em um array, como por exemplo as dimensões que utilizamos no dia-a-dia de modelos numéricos: espaço (x,y,z) e tempo (z). Dessa forma, podemos criar arrays a partir de vetores e armazená-los em diverssas dimensões.

vetor1 <- c(1,2,3,4,5)
vetor2 <- c(10,12,14,16,18,20,22,24)

a <- array(data = c(vetor1,vetor2), dim = c(3,3,2))
class(a)
## [1] "array"

Se você quiser, também é possível nomear as colunas e linhas do seu array:

colunas <- c("col1", "col2", "col3")
linhas <- c("lin1", "lin2", "lin3")

array(data = c(vetor1, vetor2), dim = c(3, 3, 2), dimnames = list(linhas, colunas))
## , , 1
## 
##      col1 col2 col3
## lin1    1    4   12
## lin2    2    5   14
## lin3    3   10   16
## 
## , , 2
## 
##      col1 col2 col3
## lin1   18   24    3
## lin2   20    1    4
## lin3   22    2    5

Além disso, sempre que precisar acessar elementos do seu array é só especificar aas dimensões como para mostrar o elemento de um vetor.

a[1,2,2] #(linha, coluna, matriz)
## [1] 24

Exercício: Crie um array com 3 dimensões, contendo três linhas e 4 quatro colunas. Acesse o elemento da segunda linha e terceira coluna desse array. Não esqueça de verificar a classe desse objeto!


3.6 Matrizes e a função matrix

Uma matriz é um array com duas dimensões, sendo necessário informar o número de colunas e linhas, mas não o de dimensões.

Assim como em arrays, só são permitidos elementos da mesma clase!

Argumentos da função matrix:

args(matrix)
## function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) 
## NULL

Colocando dados em uma matriz:

m1 <- matrix(data = 1:(4*4), nrow = 4, ncol = 4)
dim(m1)
## [1] 4 4

Por padrão, a opção “byrow” é igual a FALSE. Quando passamos para TRUE, é possível organizar os dados por linha.

m2 <- matrix(data = 1:(4*4), nrow = 4, ncol = 4, byrow = TRUE)

Exercício: Construa uma matriz com três linhas que contenha os números de 1 a 9.


3.7 Listas

Já as listas permitem que você armazene qualquer tipo de variável básica, independente da classe. Dessa forma, podemos colocar numa lista: número, caracteres, argumentos lógicos, ou que você quiser:

list(list(list(list(1))))
## [[1]]
## [[1]][[1]]
## [[1]][[1]][[1]]
## [[1]][[1]][[1]][[1]]
## [1] 1

Isso faz com que elas sejam bastante versáteis e sirvam para armazenar o que você precisar, mas elas só podem ter uma dimensão, como uma fila. Já os objetos armazenados dentro da lista não precisam ter a mesma dimensão.

x <- list(1, "a", TRUE, 1 + 4i)

Exercício: Crie uma lista contendo um vetor, uma matriz e um data frame e acesse o segundo elemento dela.

Para facilitar, já vamos te dar o data frame:

my_df <- mtcars[1:10,]

3.8 Data Frames

Os data frames são uma forma de armazenar seus dados em um formato parecido com uma planilha de excel. Você pode pensar em um data frame como uma matriz que armazena em cada coluna um dado diferente, ou como uma lista onde todos os elementos tem o mesmo comprimento.

df <- data.frame(a = 1:3)
names(df)
## [1] "a"
class(df)
## [1] "data.frame"
mode(df)
## [1] "list"

É normalmente em um data frame que você importará os seus dados e vale saber como visualizar algumas informações básicas sobre ele direto no seu console. Para isso, vamos pegar como exemplo o conjunto mtcars da base de dados do R:

df <- mtcars
head(df) #mostra as sete primeiras linhas do data frame
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Para ver as últimas linhas do data frame basta usar a função tail. Já uma função muito útil é a summary, que apresenta um “resumo” dos seus dados, como média, mediana, mínimos e máximos para cada coluna do data frame.

summary(df)
##       mpg             cyl             disp             hp       
##  Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
##  1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
##  Median :19.20   Median :6.000   Median :196.3   Median :123.0  
##  Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
##  3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
##  Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
##       drat             wt             qsec             vs        
##  Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
##  1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
##  Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
##  Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
##  3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
##  Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
##        am              gear            carb      
##  Min.   :0.0000   Min.   :3.000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
##  Median :0.0000   Median :4.000   Median :2.000  
##  Mean   :0.4062   Mean   :3.688   Mean   :2.812  
##  3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :1.0000   Max.   :5.000   Max.   :8.000

Iremos trabalhar bastante com data frames daqui pra frente, eles se tornarão aliados muito poderosos.

3.9 Tempo e Data

O R trabalha com três classe de tempo: POSIXct, POSIXlt e Date, sendo que POSIXct se refere ao número de segundos desde o início de 1970 no modo UTC, enquanto que POSIXlt armazena as datas como uma lista, contendo segundos, minutos, horas, dias, meses, etc.

a <- ISOdate(year = 2018, month = 4, day = 5)
class(a)
## [1] "POSIXct" "POSIXt"
b <- ISOdate(year = 2018, month = 4, day = 5, tz = "Americas/Sao_Paulo")

Já a classe Date, armazena as datas como o número de dias contados a partir de 1970.

c <- as.Date(Sys.time())
class(c)
## [1] "Date"

Caso você precise, o pacote nanotime permite trabalhar com nano segundos.

Também é possível fazer sequências:

hoje <- Sys.time()
a <- seq.POSIXt(from = hoje, by = 3600, length.out = 24)

Funções úteis: weekdays, month e julian

weekdays(a)
##  [1] "sexta"  "sexta"  "sexta"  "sexta"  "sexta"  "sexta"  "sexta" 
##  [8] "sexta"  "sexta"  "sábado" "sábado" "sábado" "sábado" "sábado"
## [15] "sábado" "sábado" "sábado" "sábado" "sábado" "sábado" "sábado"
## [22] "sábado" "sábado" "sábado"
months(a)
##  [1] "junho" "junho" "junho" "junho" "junho" "junho" "junho" "junho"
##  [9] "junho" "junho" "junho" "junho" "junho" "junho" "junho" "junho"
## [17] "junho" "junho" "junho" "junho" "junho" "junho" "junho" "junho"
julian(a) #dia Juliano
## Time differences in days
##  [1] 17690.76 17690.80 17690.85 17690.89 17690.93 17690.97 17691.01
##  [8] 17691.05 17691.10 17691.14 17691.18 17691.22 17691.26 17691.30
## [15] 17691.35 17691.39 17691.43 17691.47 17691.51 17691.55 17691.60
## [22] 17691.64 17691.68 17691.72
## attr(,"origin")
## [1] "1970-01-01 GMT"

O formato POSIXct é o mais comumente usado principalmente se os dados analisados serão plotados.

3.10 Fatores

Os factors podem ser um pouco infernais. Dê uma olhada em R INFERNO.
Usados em análise estatísica, fatores são usados para armazenar variáveis categóricas, ou seja, é uma variável que pode pertencer a um número limitado de categorias, como por exemplo, dias da semana. Já uma variável contínua pode assumir um um número infinito de valores.

a <- seq.POSIXt(from = hoje , by = 3600, length.out = 24*7)
aa <- weekdays(a)
class(aa)
## [1] "character"
factor(aa)
##   [1] sexta   sexta   sexta   sexta   sexta   sexta   sexta   sexta  
##   [9] sexta   sábado  sábado  sábado  sábado  sábado  sábado  sábado 
##  [17] sábado  sábado  sábado  sábado  sábado  sábado  sábado  sábado 
##  [25] sábado  sábado  sábado  sábado  sábado  sábado  sábado  sábado 
##  [33] sábado  domingo domingo domingo domingo domingo domingo domingo
##  [41] domingo domingo domingo domingo domingo domingo domingo domingo
##  [49] domingo domingo domingo domingo domingo domingo domingo domingo
##  [57] domingo segunda segunda segunda segunda segunda segunda segunda
##  [65] segunda segunda segunda segunda segunda segunda segunda segunda
##  [73] segunda segunda segunda segunda segunda segunda segunda segunda
##  [81] segunda terça   terça   terça   terça   terça   terça   terça  
##  [89] terça   terça   terça   terça   terça   terça   terça   terça  
##  [97] terça   terça   terça   terça   terça   terça   terça   terça  
## [105] terça   quarta  quarta  quarta  quarta  quarta  quarta  quarta 
## [113] quarta  quarta  quarta  quarta  quarta  quarta  quarta  quarta 
## [121] quarta  quarta  quarta  quarta  quarta  quarta  quarta  quarta 
## [129] quarta  quinta  quinta  quinta  quinta  quinta  quinta  quinta 
## [137] quinta  quinta  quinta  quinta  quinta  quinta  quinta  quinta 
## [145] quinta  quinta  quinta  quinta  quinta  quinta  quinta  quinta 
## [153] quinta  sexta   sexta   sexta   sexta   sexta   sexta   sexta  
## [161] sexta   sexta   sexta   sexta   sexta   sexta   sexta   sexta  
## Levels: domingo quarta quinta sábado segunda sexta terça

São muito úteis para regressões, gráficos e resumos estatísitcos, uma vez que limita o número de possibilidades para a qual o dado pertença. Além disso, é possível estabelecer “níveis” que vão designar a categoria do seu dado.

ab <- factor(x = aa,
             levels = c("Monday", "Tuesday",  "Wednesday",  "Thursday",
                        "Friday", "Saturday", "Sunday"))
levels(ab)
## [1] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Saturday" 
## [7] "Sunday"

Exercício: Converta o vetor abaixo em um fator e mostre os seus níveis

genero <- c("Masculino", "Masculino", "Feminino", "Masculino", "Feminino", "Feminino")


Se tudo pareceu muito corrido, não se preocupe, todos esses conceitos serão praticados mais adiante!

#-- Opção para deixar possível visualizar erros
knitr::opts_chunk$set(error = TRUE)