R Básico - Introdução - Tipos e Estruturas de Dados

November 04, 2015

Introdução

Olá pessoal,

Vamos começar a falar de R aqui. Para os que não sabem, R é uma linguagem de programação voltada para análises de dados, estatística, mineração de dados, aprendizagem automática (machine learning), entre outros. Criada por Ross Ihaka e Robert Gentleman, baseada na linguagem S (daí, o nome).

Para instalação do R, acesse aqui: [](”https://cran.r-project.org/“>link

Também é recomendável a utilização do Rstudio, excelente IDE para R, que você pode encontrar aqui: link

Com ambos instalados, você pode entrar no Rstudio e começar a escrever suas instruções e scripts em R.

Funcionalidades Básicas

Ao entrar no Rstudio, esta é a cara dele:

Tela do R Studio em funcionamento
Tela do R Studio em funcionamento

Você pode começar a escrever seu código no console. Digite "Ola mundo" no console e veja o que acontece:

PS: Para nossas demonstrações, as linhas que digitaremos estarão em branco e as respostas do R estarão em amarelo.

"Ola, mundo"
## [1] "Ola, mundo"

O R mostra o que você escreveu, juntamente com este [1] do lado. Logo veremos o que este [1] significa, mas como podemos ver, o R printa de volta o resultado de comandos que você dá. Tente por exemplo uma soma

3 + 5
## [1] 8

Agora, o R mostra o resultado da soma que você escreveu. O R tem as seguintes operações básicas:

Sign Operation
+ Adição
Subtração
/ Divisão
* Multiplicação
^ Potência
sqrt Raiz quadrada

Vamos ver alguns exemplos de cada uma delas:

4+5
## [1] 9
7-2
## [1] 5
6*8
## [1] 48
9/3
## [1] 3
4^3
## [1] 64
sqrt(25)
## [1] 5

Variáveis e tipos básicos de dados

Para guardar os valores em uma variável em R, usamos <-. Neste caso, o print automático não ocorre, e caso queira checar qual é o valor daquela variável, basta digitar seu nome novamente, ou utilizar o comando print(nome_da_variavel). Vejamos:

a <- 5 + 3
a
## [1] 8
print(a)
## [1] 8

Esta é uma variável numérica, como você pode ver ao usar a função class(). Se quiser trabalhar com inteiros, você deve defini-los como Integer, através da função as.integer(). Vejamos:

var1 <- 3
var2 <- as.integer(3)
class(var1)
## [1] "numeric"
class(var2)
## [1] "integer"

Em R, os dados também podem ser do tipo character, que é uma variável de texto (em outras linguagens pode ser conhecida como string) e logical (que em outras linguagens pode ser conhecida como boolean), e que assume os valores TRUE ou FALSE. Exemplos:

b <- "Ola mundo"
c <- TRUE
class(b)
## [1] "character"
class(c)
## [1] "logical"

Por fim, temos os factors. Os “factors” são usados para representar categorias. Isso quer dizer que em uma variável “factor”, aquele valor terá uma quantidade limitada de valores. Pense, por exemplo, numa patente militar. Existe um número definido de patentes, e o valor estará dentro destas possibilidades. Um nome de uma pessoa, ao contrário, tem infinitas possibilidades. Não existe uma lista pre-definida, e qualquer um pode criar um novo nome. Para criar um “factor”, vamos aproveitar o exemplo das patentes militares e utilizar a função factor():

militares <- c("Soldado","Soldado", "Coronel","General", "Tenente","Tenente",
               "Cabo","Soldado","Soldado","Cabo","Cabo","Soldado")
militares <- factor(militares)
print(militares)
##  [1] Soldado Soldado Coronel General Tenente Tenente Cabo    Soldado
##  [9] Soldado Cabo    Cabo    Soldado
## Levels: Cabo Coronel General Soldado Tenente
table(militares)
## militares
##    Cabo Coronel General Soldado Tenente 
##       3       1       1       5       2

Ao printar o vetor, vemos que o R nos indica os levels, que nada mais são do que os valores únicos que existem naquele vetor. Usando a função table, podemos ver a contagem de cada uma das categorias. Vemos que elas estão ordenadas em ordem alfabética. Mas podemos reorganizar esta ordem, se dentre as categorias existir uma que faça mais sentido, desta forma:

militares <- factor(militares, levels=c("Soldado","Cabo","Tenente",
                                        "Coronel","General"))
table(militares)
## militares
## Soldado    Cabo Tenente Coronel General
##       5       3       2       1       1

Estruturas de dados no R

Agora vamos falar das estruturas de dados no R.

Vetores

Os vetores são uma sequência simples de elementos do mesmo tipo. Quando definimos uma variável como fizemos anteriormente, é criado um vetor com um elemento. Observe:

var1 <- 3
is.vector(var1)
## [1] TRUE

Isso explica aquele [1] que vimos no início do post. Quando você associa uma variável dessa forma, o R cria um vetor, e o valor que você definiu será o primeiro item deste vetor.

Para criarmos vetores com mais de um elemento, incluiremos os valores desejados dentro de um c(). Veja o exemplo:

var1 <- c(3,6, 7.8, 332)
print(var1)
## [1]   3.0   6.0   7.8 332.0
var2 <- c("Ola","tudo","bem")
print(var2)
## [1] "Ola"  "tudo" "bem"
var3 <- c(TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE)
print(var3)
## [1]  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

Caso você tente misturar os tipos, o R irá forçar para que os elementos sejam todos da mesmo tipo. Veja alguns exemplos:

var4 <- c(3, 6, 9, "alface")
print(var4)
## [1] "3"      "6"      "9"      "alface"
class(var4)
## [1] "character"
var5 <- c(TRUE, FALSE, 1, 3)
print(var5)
## [1] 1 0 1 3
class(var5)
## [1] "numeric"

No primeiro caso, o R transformou as variáveis numéricas em character, pois era o tipo que comportaria todos os valores. No segundo caso, TRUE e FALSE podem ser representados como 1 e 0, respectivamente. O R então adotou estes valores e criou um vetor de tipo “numeric”.

Subseleção: Para selecionar um ou alguns itens de um vetor, basta utilizar colchetes ([ ]):

var4[1]
## [1] "3"
var5[2:4]
## [1] 0 1 3

Matrizes

As matrizes são estruturas que correspondem às matrizes matemáticas, conjuntos de elementos com linhas e colunas. Assim como os vetores, todos os seus elementos sao do mesmo tipo. Existem algumas formas de criar uma matriz:

mat1 <- matrix(
               c(1,5,10,30,15,8),
               nrow=3,
               ncol=2,
               byrow=TRUE)
print(mat1)
##      [,1] [,2]
## [1,]    1    5
## [2,]   10   30
## [3,]   15    8
vec1 <- c(3,4,5)
vec2 <- c(9,10,11)
mat2 <- rbind(vec1, vec2)
print(mat2)
##      [,1] [,2] [,3]
## vec1    3    4    5
## vec2    9   10   11
class(mat2)
## [1] "matrix"

Na primeira forma, definimos os elementos da matriz, o número de linhas e colunas através dos argumentos nrow e ncol, e se os elementos serão preenchidos ao longo das linhas (byrow = TRUE) ou ao longo das colunas (byrow = FALSE).

Na segunda forma, criamos dois vetores e então os juntamos através da função rbind.

Repare que na segunda matriz, o R nomeou automaticamente as linhas da matriz com os nomes dos vetores, ao invés de definir seus números.

Para selecionar itens de matrizes também utilizamos os colchetes, primeiro especificando a linha e depois a coluna que desejamos retornar:

mat1[2][1]
## [1] 10

Listas

Listas são um tipo especial de vetor, que podem conter elementos de diferentes tipos, incluindo vetores. Para mostrar do que estou falando, vou criar uma lista baseada em alguns vetores:

a <- c(3,6,9)
b <- c("a","b","c","d")
c <- c(TRUE, FALSE, TRUE, TRUE)
lista1 <- list(a,b,c)
print(lista1)
## [[1]]
## [1] 3 6 9
## 
## [[2]]
## [1] "a" "b" "c" "d"
## 
## [[3]]
## [1]  TRUE FALSE  TRUE  TRUE

Podemos retornar um pedaço da lista também com colchetes:

lista1[2]
## [[1]]
## [1] "a" "b" "c" "d"
class(lista1[2])
## [1] "list"

Porém, como vimos, o que nos é retornado é uma nova lista. Para retornar o elemento em si, diretamente, usamos colchetes duplos ([[ ]]):

lista1[[1]]
## [1] 3 6 9
class(lista1[[1]])
## [1] "numeric"

Agora sim retornamos o elemento, como pudemos ver pela sua classe. Para retornar um item dentro do item da lista, basta usar o colchete novamente, assim como fazemos como os vetores. Desta forma, podemos até modificar um item dentro do item da lista:

lista1[[2]][1]
## [1] "a"
lista1[[2]][1] <- "j"
lista1[[2]][1]
## [1] "j"

Uma última característica interessante das listas é que você pode nomear seus itens, ao invés de referencia-los pelo número. Nestes casos, as propriedades de seleção, usando colchetes e colchetes duplos continuam valendo. Como fazer isso? Assim:

lista2 <- list(alfa=c(1,2,3), beta=c(10,20,30))
lista2
## $alfa
## [1] 1 2 3
## 
## $beta
## [1] 10 20 30
lista2["alfa"]
## $alfa
## [1] 1 2 3
lista2[["alfa"]]
## [1] 1 2 3

Com listas nomeadas, uma segunda forma de referenciar seus elementos é através do simbolo $. Ele equivale aos colchetes duplos:

lista2$beta
## [1] 10 20 30

Data Frames

O Data Frame é a estrutura do R utilizada para armazenar elementos em forma de tabela, organizados em linhas e colunas. As colunas e linhas podem ser nomeadas e suas colunas. Você pode criar um data frame com a função data.frame:

df1 <- data.frame(c(1,2,3),c("baixo","medio","alto"),c(TRUE, TRUE, FALSE))
print(df1)
##   c.1..2..3. c..baixo....medio....alto.. c.TRUE..TRUE..FALSE.
## 1          1                       baixo                 TRUE
## 2          2                       medio                 TRUE
## 3          3                        alto                FALSE

Porém, para facilitar um pouco as coisas, o R vem com alguns conjuntos de dados organizados em Data Frame, para a finalidade de testes e aprendizado mesmo. Um deles é o mtcars:

print(mtcars)
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

Para selecionar um item do data frame, também utilizamos os colchetes, podendo tanto utilizar o número da linha e coluna ou os nomes:

mtcars[1,2]
## [1] 6
mtcars["Mazda RX4","gear"]
## [1] 4
mtcars["Cadillac Fleetwood",3]
## [1] 472

Além disso, também podemos selecionar uma parte do Data Frame de diferentes formas:

# Definindo o intervalo de linhas e a coluna
mtcars[1:5,1]
## [1] 21.0 21.0 22.8 21.4 18.7

# Ao omitir o valor das linhas, todas são selecionadas. O mesmo vale para colunas
mtcars[,2]
##  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
mtcars[3,]
##             mpg cyl disp hp drat   wt  qsec vs am gear carb
## Datsun 710 22.8   4  108 93 3.85 2.32 18.61  1  1    4    1

Algumas funções básicas e úteis para os data frames são a nrow, que mostra o número de linhas de um data frame, ncol, que mostra o número de colunas, ou ainda usar dim, que retorna os dois:

nrow(mtcars)
## [1] 32
ncol(mtcars)
## [1] 11
dim(mtcars)
## [1] 32 11

Para finalizar, as funções str e summary trazem algumas informaçoes úteis sobre o data frame, de uma forma geral. É comum utiliza-las ao importar um data set para o R, para se ter uma ideia do que está sendo analisado. O str conta as linhas e colunas e mostra os seus tipos e alguns valores de exemplo. Já o summary traz médias, medianas, máximos, mínimos e quantidade de valores indisponíveis em cada coluna:

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

summary(mtcars)
##       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

Para uma introdução básica ao R, este já é um bom começo. Em breve falaremos um pouco mais :)

Se tiverem comentários, é deixar aí embaixo que eu responderei a todos.

Abraços