Neste artigo vamos entender:

  • Como utilizar o R como uma calculadora?
  • Como os dados se organizam dentro do R e quais os principais tipos de valores suportados?
  • O que são vetores e data-frames?
  • Como filtrar linhas e colunas em data-frames?

O R como uma calculadora

A primeira coisa que podemos fazer ao iniciar o R é começar a brincar com o terminal, para entender como operações matemáticas podem ser feitas. Portanto, se você digitar no terminal 3+3 e der enter, verá o seguinte resultado:

> 3+3
[1] 6

Detalhe: o [1] indica a linha de retorno do processamento do R, ela sempre se inicia em [1]. Nesse caso, apenas um elemento é retornado, pois estamos somando dos escalares e este elemento é o número 6, resultado da soma de 3 + 3.

De forma análoga, temos as operações de subtração, multiplicação e divisão:

> 5-3
[1] 2

> 2*10
[1] 20

> 10/2
[5]

Potenciação e raiz quadrada também são possíveis:

> 2^4 # Dois elevado a quatro
[1] 16

> sqrt(9) # Raíz quadrada (square root) de 9
[3]

Agora que já entendemos o R como uma calculadora, vamos prosseguir para compreender melhor como o R armazena e estrutura os dados.

Dados e estrutura interna

Dentro do R, os dados são organizados em estruturas chamadas objetos. Para simplificar o entendimento, tanto variáveis, como tabelas inteiras, e até mesmo saídas de funções são consideradas objetos dentro do R.

Quando criamos variáveis, elas podem assumir os tipos básicos character (para caracteres), numeric (para números) ou lógico (verdadeiro/falso). Por exemplo:

> texto = "Danilo"
> numero = 38
> mora_em_sp = TRUE

Após criar essas variáveis, você pode verificar quais são os tipos (classes) dela utilizando a função class():

> class(texto)
[1] "character"

Detalhe: o [1] indica a linha de retorno do processamento do R, ou seja, como chamamos a função class(), a única coisa que ela retornou foi o tipo do valor da variável. O [1] indica qual linha de saída se refere aquela informação. Isso é útil para quando você tem listas gigantescas de dados.

> class(numero)
[1] "numeric"

> class(mora_em_sp)
[1] "logical"

Desta forma, o R faz a tipagem automática para nós de acordo com o tipo de informação que é associada à variável. Isso é importante pois alguns tipos de objetos não suportam múltiplas classes, como os vetores, por exemplo.

Vetores

Os vetores são estruturas mais complexas de objetos que armazenam múltiplos valores. Conforme dito, os vetores precisam ter os valores de mesma classe idealmente e eles são criados utilizando a função c() (concatenar), separando cada elemento por vírgula. Vamos ao exemplo a seguir:

> idades = c(10, 12, 15, 16)
> class(idades)
[1] "numeric"

Se você misturar tipos, o R faz a conversão automática para garantir que todos os elementos existam. Por exemplo, se numa lista de numbers um character for adicionado, todos os números serão convertidos em caracteres:

> idades_mistura = c(10, 13, "erro", 10)
> idades_mistura
[1] "10"   "13"   "erro" "10"

> class(idades_mistura)
[1] "character"

Se você tem uma sequência de números e adiciona um valor logical esse valor é convertido em 0 se for FALSE ou 1 se for TRUE:

> numeros = c(10, 20, TRUE, FALSE)
> numeros
[1]  10 20  1  0

> class(numeros)
[1] "numeric"

Portanto, é sempre importante manter a consistência ao se criar vetores para não ter erros e problemas em qualidade de dados.

Como retornar elementos de um vetor?

Essa é uma pergunta importante pois vai nos ajudar adiante quando falarmos sobre Data Frames. O vetor permite acesso a elementos específicos dele através dos índices. Veja o exemplo abaixo:

> cidades = c("São Paulo", "Rio de Janeiro", "Curitiba")
> cidades[2]
[1] Rio de Janeiro

No R, diferente de muitas linguagens de programação, o índice sempre se inicia no 1, retornando o primeiro elemento do vetor. Nesse caso, colocamos o índice 2 dentro de colchetes e retornamos o segundo elemento Rio de Janeiro. É possível também solicitar ao vetor que retorne um intervalo de índices utilizando inicio:fim, veja o exemplo:

> cidades[2:3]
[1] "Rio de Janeiro" "Curitiba"

Data Frames

Por fim, podemos entender os data frames como estruturas de dados de 2 dimensões (linhas e colunas) ou conjuntos de vetores lado a lado. Vamos imaginar uma situação de uma tabela que contem nomes e idades. Vamos construí-la a partir de vetores:

> nomes = c("Maria", "João", "Alice", "Ricardo")
> idades = c(30, 34, 27, 22)
> tabela = data.frame(nomes, idades)
> tabela

    nomes idades
1   Maria     30
2    João     34
3   Alice     27
4 Ricardo     22

A função data.frame() cria uma tabela, ou data frame, utilizando os vetores de valores. Temos uma função interessante aqui que nos ajuda a identificar qual o tipo de dado cada coluna possui, como no exemplo:

> str(tabela)
'data.frame':	4 obs. of  2 variables:
 $ nomes : chr  "Maria" "João" "Alice" "Ricardo"
 $ idades: num  30 34 27 22

A função str() nos mostra a estrutura de objetos no R. Nesse caso, o retorno da função nos diz que esse objeto é um data.frame que possui 4 observações e 2 variáveis. A variável nomes é do tipo chr (character) e a variável idades é do tipo num (numeric). Segue também uma amostra dos valores para ilustrar o tipo de cada coluna. Note que como essa tabela que fizemos é pequena, todos os valores são mostrados.

Utilizando Índices no Data Frame

Para finalizar esse artigo, vamos fazer seleção de elementos no Data Frame como fizemos no vetor, caso queiramos utilizar os índices para retornar os valores. A estrutura é uma dupla de índices, cujo primeiro indica a linha e o segundo indica a coluna. Por tanto, digamos que queremos retornar a 4a linha com a 2a coluna:

> tabela[4,2]
[1] 22

O número 22 é a idade do Ricardo, ultima linha da nossa tabela. A mesma lógica vale para o intervalo de valores dos vetores utilizando os dois-pontos. No entanto, um outro modo interessante aqui é, por exemplo, retornar todas as colunas de uma determinada linha, podemos fazer da seguinte forma:

> tabela[2,]
  nomes idades
2  João     34

Deixando o índice sem preencher significa que ele retornará tudo referente àquela dimensão. Preenchendo apenas o índice da linha, veremos todas as colunas daquela determinada linha. O contrário também funciona:

> tabela[,2]
[1] 30 34 27 22

No exemplo acima todas as idades (coluna 2) são apresentadas. Uma forma alternativa de retornar uma coluna é utilizando o $ e o nome da coluna após o nome do objeto data frame, como nesse exemplo:

> tabela$nomes
[1] "Maria"   "João"    "Alice"   "Ricardo"

Simplificando um pouco o uso pois não é necessário saber exatamente qual é o número da coluna que se deseja retornar.

Próximos Passos

No próximo artigo, vamos ver como realizar operações com vetores e data-frames como por exemplo, aplicar uma fórmula sobre colunas numéricas, calcular somas, médias, entre outras coisas.