R é uma linguagem orientada a objetos, e isso significa, entre outras coisas, que toda variável é um objeto. Além disso, é possível acessar métodos e atributos de objetos.
Estes objetos são armazenados em memória, e podem ser listados e removidos. Isto é importante, pois é comum termos muitos objetos consumindo a memória do sistema, especialmente quando trabalhando na própria máquina local, de forma que o sistema pode apresentar lentidão.
Nestas situações, fazer uma limpeza dos objetos na memória pode ser muito útil para melhorar o desempenho do sistema e permitir a carga de novos dados na memória para análise.
Caso esteja usando o RStudio, é possível visualizar e remover os objetos através das opções dos painéis de visualização da sessão de trabalho (workspace), ou ainda através do respectivo menu.
Além disso, há funções nativas da linguagem R para lidar com os objetos em memória.
>ls()
>objects()
As funções ls() e objects() permitem listar os objetos em memória.
>rm(x)
A função rm() permite remover da memória um objeto específico e assim liberar recursos do sistema. Neste exemplo a variável “x” foi removida, e caso seja referenciada após a remoção, resultará num erro, pois a variável não está mais armazenada na memória do sistema.
Vetores são objetos unidimensionais, ou seja, possuem uma indexação simples através de numeração simples (a[1], por exemplo). Tendo apenas uma dimensão, vetores são adequados para armazenar dados que tenham uma relação forte entre si, de forma a deixar claro o seu uso.
Não faz sentido, por exemplo, armazenar a idade em anos e o peso em kg de uma pessoa no mesmo vetor, pois isso poderia causar uma tremenda confusão no momento do acesso aos valores armazenados. Possivelmente haveria a dúvida se o primeiro elemento se refere à idade ou peso.
Além disso, o vetor é um tipo de objeto que permite o armazenamento apenas de valores de um mesmo tipo. Observe que no exemplo acima mencionei a idade em anos e o peso em kg, pois ambos podem ser expressados através de números de ponto flutuante (ex: 17,5 e 80,3). Caso fossem de tipos diferentes, não seria possível armazená-los num mesmo vetor.
Veja que mesmo variáveis simples com um único valor são tratadas pela linguagem R como vetores (neste caso um vetor de valor único). O exemplo de código abaixo demonstra o que acabamos de descrever:
>a <- 8
>a[1]
8
Além de conter somente um tipo de dado, o vetor possui uma única dimensão, ou seja, seus elementos são referenciados utilizando um único número como índice para o elemento desejado (a[1], a[2] e assim por diante).
>v <- c(1:10)
>v
1.1
2.2
3.3
4.4
5.5
6.6
7.7
8.8
9.9
10.10
>length(v)
10
Note a função c(), usada frequentemente para criar conjuntos de elementos. Tome nota dela, pois ela será muito útil. Neste exemplo, ela foi usada para criar uma lista de valores de 1 a 10 para preencher o vetor. Note também a função length(), que permite verificar o tamanho do vetor (10).
>v1 = c(“Casa”, “Mercado”, “Igreja”)
>v1
1.’Casa’
2.’Mercado’
3.’Igreja’
>v2 = c(5.5, 7.9, 8.7)
>v2
1.5.5
2.7.9
3.8.7
Podemos criar vetores de vários tipos: inteiros, caractere, números de ponto flutuante, basta que sejam todos do mesmo tipo.
>v3 = seq(1:10)
>v3
1.1
2.2
3.3
4.4
5.5
6.6
7.7
8.8
9.9
10.10
>is.vector(v3)
TRUE
Outra função muito útil é a seq(), que permite criar uma sequência de números. Neste exemplo, a função foi usada para criar uma lista de 10 números de 1 a 10.
>v4 = rep(1,5)
>v4
1.1
2.1
3.1
4.1
5.1
>is.vector(v3)
TRUE
Já a função rep() permite repetir um valor por determinada quantidade de vezes. Neste exemplo, a função foi usada para criar 5 repetições do valor 1.
É possível ainda realizar operações entre vetores, ou entre um vetor e um outro valor ou variável.
>v * 5
5
10
15
20
25
30
35
40
45
50
Observe que cada um dos elementos de v foi multiplicado por 5, como esperado.
>v + v2
Warning message in v + v2:
“longer object length is not a multiple of shorter object length”
6.5
9.9
11.7
9.5
12.9
14.7
12.5
15.9
17.7
15.5
Observe que, embora os vetores v e v2 tenham tamanhos diferentes, a soma foi possível porque o interpretador da linguagem R foi capaz de “repetir” os elementos do vetor menor (v2, no caso) até que houvesse uma quantidade suficiente de elementos que permitisse a soma. Então, é como se fosse feita a soma entre v: “1,2,3,4,5,6,7,8,9,10” e v2: “5.5, 7.9, 8.7, 5.5, 7.9, 8.7, 5.5, 7.9, 8.7, 5.5”. Note que o interpretador ainda informa uma mensagem indicando que o vetor menor não é múltiplo do maior, pois 3 não é múltiplo de 10.
>v – v2
Warning message in v – v2:
“longer object length is not a multiple of shorter object length”
-4.5
-5.9
-5.7
-1.5
-2.9
-2.7
1.5
0.0999999999999996
0.300000000000001
4.5
De forma semelhante à soma, o vetor v2 foi “replicado” para permitir a operação de subtração com o vetor v.
>v * v2
Warning message in v * v2:
“longer object length is not a multiple of shorter object length”
5.5
15.8
26.1
22
39.5
52.2
38.5
63.2
78.3
55
Na operação de multiplicação, da mesma forma o vetor v2 foi ampliado.
>v / v2
Warning message in v/v2:
“longer object length is not a multiple of shorter object length”
0.181818181818182
0.253164556962025
0.344827586206897
0.727272727272727
0.632911392405063
0.689655172413793
1.27272727272727
1.0126582278481
1.03448275862069
1.81818181818182
Por fim, a operação de divisão foi bem sucedida graças, mais uma vez, à “inteligência” do interpretador da linguagem R, que sempre busca, quando possível, encontrar a melhor maneira de chegar ao resultado desejado pelo desenvolvedor.
>names(v2) = c(“Nota AV1”, “Nota AV2”, “Nota AV3”)
>v2[“Nota AV1”]
Nota AV1: 5.5
Vetores podem ter nomes atribuídos a cada uma de suas “colunas”, de modo a simplificar a referência aos seus elementos e facilitar o entendimento da sua manipulação. Neste exemplo, consideramos que o vetor v2 contém as notas dos alunos nas avaliações da disciplina, e assim nomeamos cada uma das notas de acordo com as avaliações realizadas.
Por vezes poderemos estar interessados em armazenar a nossa informação em estruturas de dados com mais do que uma dimensão, como é o caso dos vetores. As matrizes arranjam a informação em duas dimensões. Em R, as matrizes não são mais do que vetores com uma propriedade especial que é a dimensão. Vejamos um exemplo. Suponhamos que temos doze números correspondentes às vendas trimestrais durante o último ano, em três lojas. As instruções seguintes permitem “organizar” esses números como uma matriz (TORGO, 2006, tradução nossa).
> vendas <- c(45, 23, 66, 77, 33, 44, 56, 12, 78, 23, 78, 90)
> vendas
[1] 45 23 66 77 33 44 56 12 78 23 78 90
> dim(vendas) <- c(3, 4)
> vendas
[,1] [,2] [,3] [,4]
[1,] 45 77 56 23
[2,] 23 33 12 78
[3,] 66 44 78 90
>length(vendas)
12
É possível saber o tamanho da matriz usando a função length().
>vendas[1,1]
45
>vendas[3,4]
90
É possível referenciar elementos específicos da matriz indicando linha e coluna.
>vendas[1,]
45
77
56
23
É possível obter todos os valores de uma linha da matriz.
>vendas[,1]
45
23
66
Também é possível obter todos os elementos de uma coluna da matriz.
Assim como no caso dos vetores, é possível realizar operações de soma, subtração, multiplicação, divisão entre duas matrizes ou uma matriz e um valor ou variável, assim como também é possível utilizar os demais operadores aritméticos, relacionais e lógicos para verificar características da matriz.
>vendas > 50
FALSE TRUE TRUE FALSE
FALSE FALSE FALSE TRUE
TRUE FALSE TRUE TRUE
Observe no exemplo acima, que o interpretador “percebeu” que desejávamos saber quais os elementos da matriz eram maiores que 50. Na prática, este resultado indica em quais trimestres as vendas foram superiores a 50 em cada loja. Assim, o interpretador forneceu como resultado uma matriz de valores lógicos em que cada elemento representa a resposta para a verificação do valor da venda: se acima de 50, o elemento tem valor TRUE, caso contrário FALSE.
“Os arrays são extensões das matrizes para mais do que duas dimensões. Isto significa que podem ter vários índices. À parte esta pequena diferença, eles podem ser usados da mesma forma do que as matrizes. De modo semelhante à função matrix, existe uma função array() para facilitar a criação de arrays. Segue-se um pequeno exemplo” (TORGO, 2006, tradução nossa).
> a <- array(1:50, dim = c(2, 5, 5))
> a , , 1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
, , 2
[,1] [,2] [,3] [,4] [,5]
[1,] 11 13 15 17 19
[2,] 12 14 16 18 20
, , 3
[,1] [,2] [,3] [,4] [,5]
[1,] 21 23 25 27 29
[2,] 22 24 26 28 30
, , 4
[,1] [,2] [,3] [,4] [,5]
[1,] 31 33 35 37 39
[2,] 32 34 36 38 40
, , 5
[,1] [,2] [,3] [,4] [,5]
[1,] 41 43 45 47 49
[2,] 42 44 46 48 50
Perceba que, neste exemplo, é como se houvessem 5 matrizes “empilhadas”, formando uma figura multidimensional.
A maioria das operações que podem ser feitas com vetores e matrizes, são também válidas para arrays.
Tabela de Conteúdo