Objetos no R

Neste tutorial, mostramos o que são objetos no R e como manuseá-los.

José de Jesus Filho https://github.com/jjesusfilho
2022-10-15

Objetos no R

Objetos são valores nomeados. Quando falamos de valores no R, estamos nos referindo a algo que ocupa espaço na memória ram do cumputador. Pode ser um número, um texto ou um conjunto de números ou de textos.

Esses valores podem ser submetidos a operações matemáticas, no caso de números, ou transformados para gerar outros valores. Por exemplo, “Maria” pode se transformar em “MARIA”.

Criando objetos

Para criar objetos no R, você deve atribuir um valor a um nome. Exemplos:

numero <- 2

nome <- "Maria"
numero
[1] 2
nome
[1] "Maria"

Perceba que usamos o operador <- para atribuir o valor a um nome. No R, você sempre usa esse operador para atribuir. Há um outro operador, o =, que também pode ser usado, mas este possui usos mais específicos e falaremos dele no momento oportuno.

Dar nomes a objetos é como dar nome a filhos, alguns são proibidos, outros podem causar muitos problemas no futuro. Se você quiser chamar seu filho de “Esfiha”, o cartório irá recusar o registro. Se você usar certos nomes, o R retornará um erro. Veja os exemplos abaixo, nomes têm de começar com letra e não podem ter operadores.

3 <- 2 
4m <- 4
_x <- 'Mário' 
bem-te-vi <- "pássaro" ## O hífen é um operador matemático.

Em todos os casos acima, o R recusará a criação do objeto. Assim mesmo, caso queira insistir na nomeação não convencional, o R aceitará se você usar o acento grave como demarcador:

`3` <- 2 
`3`
[1] 2

Se você fizer isso, as chances de encontrar problemas no futuro são altas.

É aconselhável usar nomes sugestivos dos valores contidos neles, em letra minúscula e separados por _.

idade <- c(25,29,40,57)
endereco_residencial <- "Rua José Mario Pereira, 43"

Vetores

Quando concatenamos um conjunto de valores da mesma natureza, chamamos esse objeto de vetor atômico. Exemplos:

numeros <- c(2,5,9,20)
numeros 
[1]  2  5  9 20
nomes <- c("Maria", "Flávia","Roberto", "Pedro")
nomes
[1] "Maria"   "Flávia"  "Roberto" "Pedro"  

Observe que para criar esses objetos, colocamos eles dentro da letra c com parênteses, que significa concatenar valores.

Os vetores atômicos são assim chamados porque só podem conter um tipo de valor. Se você tentar concatenar texto com número, este último será convertido em texto e você perderá a capacidade de realizar operações matemáticas com ele.

x <- c("Mário", 3)
x
[1] "Mário" "3"    

Tipos e classes de objetos

Os objetos podem ter tipos e classes. Os tipos correspondem à natureza mesma do objeto, as classes dizem respeito ao comportamento.

Inteiros

Você define um inteiro no R, colocando um L depois do número:

inteiro <- 4L
typeof(inteiro)
[1] "integer"

Note que usamos a função typeof() para saber qual a natureza do objeto.

Double

Double ou precisão dupla são formatos numéricos que ocupam 64 bits da memória do computador, em contraste precisão singular, que ocupam 32. São usados para referir a números com casas decimais, tanto racionais quanto irracionais.

x <- 2.3
y <- pi

typeof(x)
[1] "double"
typeof(y)
[1] "double"

Character

Character é o formato texto, ou string, em outras linguagens. Você usa ele para criar valores que não serão usados para operações matématicas. Para criar character, você precisa usar aspas simples ou duplas.

nome <- "Flaviana"
cpf <- "123.456.768-10"

Se você colocar aspas nos números, eles serão tratados como characteres. Se você tentar realizar operações, o R retornará um erro.

n1 <- "2"
n2 <- "3"

n1 + n2
Error in n1 + n2: argumento não-numérico para operador binário

Mesmos tipos, diferentes comportamentos (classes)

Em programação, além dos tipos, existe uma outro conceito chamado classe, o qual diz respeito ao comportamento dos objetos. Os tipos básicos que vimos acima, podem ser representados em diferentes classes. Duas delas são especialmente importantes: datas e fatores

Datas

Datas são do tipo numérico (double), mas visualizadas no seguinte formato: “aaaa-mm-dd”, ou seja, mês, dia, ano. Esse formato segue o padrão internacional ISO-8601. O ano vem sempre com quatro dígitos e a ordem segue do maior para o menor.

Para criar datas, precisamos de uma função do R chamas as.Date().

d1 <- as.Date("2022-02-15")
d1
[1] "2022-02-15"

Veja que ela foi impressa entre aspas, mas na verdade ela é um double:

typeof(d1)
[1] "double"

Isso ocorre porque, dessa forma, você pode realizar operações matemáticas com datas:

d1 <- as.Date("2022-02-15")
d2 <- as.Date("2022-03-16")

d2 - d1
Time difference of 29 days

Como a data é um número, é possível convertê-la para o formato double, usando a função as.numeric():

[1] 19038

Esse número, 19038, é o número de dias desde 01 de janeiro de 1970. Datas anteriores a esta data são representadas negativamente:

n3 <- as.Date("1950-04-03")
as.numeric(n3)
[1] -7213

Fatores

Suponha que você realize uma pesquisa entre seus colegas de trabalho com perguntas como: Qual o seu primeiro nome e qual a sua religião e obtenha as seguintes respostas:

primeiro_nome <- c("Fábio","Maria","Maria","José", "Catarina","José")

primeiro_nome
[1] "Fábio"    "Maria"    "Maria"    "José"     "Catarina" "José"    
religiao <- c("cristão","espírita","budista", "cristão","espírita", "cristão")
religiao
[1] "cristão"  "espírita" "budista"  "cristão"  "espírita" "cristão" 

Parece natural que alguns nomes e algumas religões vão se repetir nas respostas. Quando isso acontece, é preferível pedir ao R para armazenar essas respostas como números e associar etiquetas a esses números, correspondentes às respostas. Esse tipo de dados é chamado de categórico porque os possíveis valores que ele assume são conhecidos e limitados.

Existe uma função no R própria para tratar de dados categóricos.

primeiro_nome <- factor(primeiro_nome)
primeiro_nome
[1] Fábio    Maria    Maria    José     Catarina José    
Levels: Catarina Fábio José Maria
religiao <- factor(religiao)
religiao
[1] cristão  espírita budista  cristão  espírita cristão 
Levels: budista cristão espírita

Ao chamar o função factor(), o R associa cada categoria a um número e etiqueta cada uma delas com os nomes originais. Essas etiquetas são atributos chamados níveis (levels). Note que os levels estão em ordem alfabética e são únicos.

Religião agora é do tipo numérico, mas de classe fator. Sua natureza é numérica, mas seu comportamento é de categoria. Você visualiza como se fosse texto, mas, na verdade, é um número.

Se você converter o fator para inteiro, ele retorna os números correspondentes.

as.integer(religiao)
[1] 2 3 1 2 3 2

Há duas vantagens em usar fatores. A primeira é que os dados serão armazenados como inteiros, o que reduz o uso da memória. A segunda é que análises estatísticas realizam operações com matrizes numéricas.

Matrizes

Matrizes são vetores atômicos com duas dimensões. Vamos criar um vetor de quinze números sequenciais. No R, você faz isso usando : (dois pontos) entre o primeiro e o último:

x <- 1:15
x
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

Agora vamos converter para uma matriz de duas três colunas e cinco linhas:

matrix(x, nrow = 5) # É suficiente informar o número de linhas
     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    2    7   12
[3,]    3    8   13
[4,]    4    9   14
[5,]    5   10   15

Você pode criar uma matriz de textos também. Vamos criar um vetor com as dezesseis primeiras letras do alfabeto. O R já tem um objeto chamado letters, vamos simplesmente obter um subconjunto delas. Para tanto, usamos colchetes.

x <- letters[1:16]
x
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p"
matrix(x, ncol = 4)
     [,1] [,2] [,3] [,4]
[1,] "a"  "e"  "i"  "m" 
[2,] "b"  "f"  "j"  "n" 
[3,] "c"  "g"  "k"  "o" 
[4,] "d"  "h"  "l"  "p" 

Uma característica das matrizes é que elas são atômicas, i.e, todos os elementos têm de ser do mesmo tipo.

Dataframes

Semelhante às planilhas do excel ou as tabelas de SQL, o R possui dataframes, que são nada menos que um emparelhamento de vetores do mesmo tamanho.

Para criar dataframes, você usa a função data.frame(). Vamos criar um dataframe com os nomes e respectivas religiões acima criados.

df <- data.frame(primeir_nome = primeiro_nome,
                 religiao = religiao)
df
  primeir_nome religiao
1        Fábio  cristão
2        Maria espírita
3        Maria  budista
4         José  cristão
5     Catarina espírita
6         José  cristão

Há uma classe especial de dataframe chamada tibble, que é praticamente idêntica a dataframe, mas um pouco mais segura para operar.

Listas

Por fim, o R possui um tipo de objeto chamado list. Listas podem conter todos os demais tipois de objetos. Elas geralmente são usados para conter objetos de diferentes tipos e tamanhos. Podemos criar uma lista com alguns dos objetos já criados.

lista <- list(religiao, x, df)
lista
[[1]]
[1] cristão  espírita budista  cristão  espírita cristão 
Levels: budista cristão espírita

[[2]]
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p"

[[3]]
  primeir_nome religiao
1        Fábio  cristão
2        Maria espírita
3        Maria  budista
4         José  cristão
5     Catarina espírita
6         José  cristão

Os dataframes são, a rigor, listas também, em que cada coluna constitui um elemento. Eles são listas com a classe dataframe. Isso significa que o comportamento dos dataframes será diferente das demais listas. Vamos perguntar ao R qual o tipo e qual a classe do objeto df acima criado.

typeof(df)
[1] "list"
class(df)
[1] "data.frame"

Indexação e subconjuntos

Diferentemente de outras linguagens, como Python, que começam a contar do zero, o R começa a contar os elementos de um vetor ou de uma lista, a partir do 1 (um) até o tamanho do vetor.

Para extrair um elemento de um vetor ou de uma lista, use colchetes com o índice. Por exemplo, se quiser obter a segunda letra do alfabeto:

letters[2]
[1] "b"

Para obter da segunda até a quarta letra:

letters[2:4]
[1] "b" "c" "d"

Se você quiser excluir uma delas, use o sinal de menos na frente do número:

letters[-1]
 [1] "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
[17] "r" "s" "t" "u" "v" "w" "x" "y" "z"

Por outro lado, se você quiser obter valores contando do final, use a função length() dentro dos colchetes:

letters[length(letters)]
[1] "z"

Há também uma função chamada tail(), que é mais lenta, mas é mais flexível:

tail(letters,1)
[1] "z"

Se quiser obter os três últimos valores:

tail(letters,3)
[1] "x" "y" "z"

Essas mesmas regras valem para listas em geral. Para dataframes, há um pacote chamado dplyr(), o qual possui funções próprias para isso.

Citation

For attribution, please cite this work as

Filho (2022, Oct. 15). Jurimetria: Objetos no R. Retrieved from https://direitoemdados.consudata.com.br/posts/2022-10-15-objetos/

BibTeX citation

@misc{filho2022objetos,
  author = {Filho, José de Jesus},
  title = {Jurimetria: Objetos no R},
  url = {https://direitoemdados.consudata.com.br/posts/2022-10-15-objetos/},
  year = {2022}
}