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