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 comummelt
: 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)