6.1 Vetores e tipos de dados

Uma conjunto de um ou elementos formam um vetor19 (vector no idioma ). Vetor é a estrutura básica de dados do e podem ser de dois tipos: vetores atômicos e listas20.

Um vetor atômico tem elementos só de um mesmo tipo de dado. Os quatro tipos básicos de vetores atômicos (tabela 6.1) são:

  • double (real)

  • integer (inteiro)

  • character (caracteres)

  • logical (lógico)

A relação entre estes tipos de dados é mostrada na Figura 6.1.

Tabela 6.1: Principais tipos de dados do R.
Tipo de dados Classe no R exemplo
Números inteiros integer 2, 11
Números reais double 0.1234, 1.23e4
Caracteres character "adar"
Lógicos logical TRUE, FALSE
Relação entre os diferentes tipos de vetores atômicos.

Figura 6.1: Relação entre os diferentes tipos de vetores atômicos.

Embora existam dois tipos de vetores o termo "vetor" é em geral usado para se referir ao do tipo atômico.

6.1.1 Construindo vetores

Vetores atômicos são geralmente criados com a função c(), abreviatura para combinar ou concatenar. Os argumentos dessa função podem ser especificados separados por vírgula. Por exemplo, para criar um vetor com números reais chamado vetor_dbl, escrevemos:

(vetor_dbl <- c(-1.51, 0.33, 1.46, 2.04))
#> [1] -1.51  0.33  1.46  2.04

A função c() aceita um número variado de argumentos, o que é representado por três pontos ou reticências (...) na sua documentação de ajuda (?c).

Para saber qual a classe ou tipo de uma variável podemos usar a função class().

class(vetor_dbl)
#> [1] "numeric"

6.1.2 Números

O tipo de dados mais usado no é chamado numeric. Este tipo inclui números inteiros, decimais, positivos, negativos e zero. Um dado do tipo numérico pode ser real (double) ou inteiro (integer) (Figura 6.1).

Números inteiros: são geralmente usados para contagem (n° habitantes, n° de palavras, quantidade de eventos de um dado fenômeno). São números sem a parte fracionária.

Números reais: podem ter uma parte fracionária e uma inteira. Estes resultam de medidas que podem assumir qualquer valor: 3.5 horas, 10.4 mm, 18.1 °C.

Medidas são compostas de um número e uma escala. Você pode estar trabalhando com valores de população na escala de milhões de habitantes, mas o valor pode ser apenas 1.7. Para garantir consistência nos seus cálculos, em termos de unidades, é recomendado nomear sua variável com alguma referência à sua unidade de medida. Erros de unidades podem ter consequências catastróficas como o exemplo do Caso do Orbitador Climático de Marte.

Como todo n° inteiro pode ser representado como real, por padrão números (ou operações envolvendo números) são definidos como double (dupla precisão no formato de ponto flutuante) no . Por exemplo o vetor vetor_num é numérico:

(vetor_num <- c(-1, 0, 1, 2, NA_real_))
#> [1] -1  0  1  2 NA
class(vetor_num)
#> [1] "numeric"

Podemos determinar se uma variável é do tipo real ou inteiro com a função typeof():

typeof(vetor_num)
#> [1] "double"

Para definirmos um vetor como do tipo integer é necessário usar o sufixo L em cada elemento numérico do vetor.

(vetor_int <- c(1L, 6L, 10L, NA_integer_))
#> [1]  1  6 10 NA
typeof(vetor_int)
#> [1] "integer"

Há outra forma, bem mais prática, de criar vetores de inteiros: a partir da conversão de uma variável do tipo real (double) usando a função as.integer():

vetor_num_fi <- as.integer(vetor_num)
typeof(vetor_num_fi)
#> [1] "integer"

Na exemplo acima nós forçamos a conversão da variável vetor_num do tipo real para inteiro e verificamos qual seu tipo.

Há outros tipos de dados numéricos no R, como: complexos e hexadecimais.

6.1.3 Caractere

Um grupo de caracteres (ou strings), letras ou qualquer forma de texto são dados do tipo character. Eles são identificados por aspas dupla (") ou simples (') no início e fim de uma sequência de caracteres. Qualquer um destes delimitadores de caracteres podem ser usados para definir um dado como caractere:

(vetor_char <- c('ae', NA_character_, "ou"))
#> [1] "ae" NA   "ou"
class(vetor_char)
#> [1] "character"

Dados do tipo caractere são usados para descrição qualitativa de uma variável, como no caso de identificadores (por exemplo: nome de pessoas, cidades, IP de computadores em uma rede, cores, etc).

O número de letras em cada elemento de um vetor do tipo character podemos determinar com nchar().

nchar(vetor_char)
#> [1]  2 NA  2

O vem com alguns vetores de caracteres pré-definidos:

# alfabeto inglês em letras minúsculas
letters
#>  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
#> [20] "t" "u" "v" "w" "x" "y" "z"
# alfabeto inglês em letras maiúsculas
LETTERS
#>  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
#> [20] "T" "U" "V" "W" "X" "Y" "Z"
# nomes dos meses em inglês
month.name
#>  [1] "January"   "February"  "March"     "April"     "May"       "June"     
#>  [7] "July"      "August"    "September" "October"   "November"  "December"
# abreviatura dos nomes dos meses em inglês
month.abb
#>  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

Se você precisar incluir aspas duplas ou apóstrofe em um caractere usando os dois delimitadores juntos, como nos dois exemplos, respectivamente:

citacao <- 'Me diga o que é pior: "Desistir do que quer ou se contentar com o que nunca quis?" - Reverb Poesia.'
citacao
#> [1] "Me diga o que é pior: \"Desistir do que quer ou se contentar com o que nunca quis?\" - Reverb Poesia."

sentenca_apos <- "Marca d'água"
sentenca_apos
#> [1] "Marca d'água"

Se precisar usar ambos delimitadores dentro um mesmo caractere, use a barra invertida (\) antes do delimitador que deseja desconsiderar.

(sentenca_2aspas <- "Ele disse: \"Me sinto como um peixe fora d'água\"")
#> [1] "Ele disse: \"Me sinto como um peixe fora d'água\""

Note que a impressão de caracteres no console inclui a barra invertida para maior clareza. Esse padrão também ocorre com a função print():

print(sentenca_2aspas)
#> [1] "Ele disse: \"Me sinto como um peixe fora d'água\""

Já a função cat()21, interpreta caracteres especiais (como a barra invertida \ e a quebra de linha \n), para então dar saída na tela.

cat(sentenca_2aspas, "\n")
#> Ele disse: "Me sinto como um peixe fora d'água"

Há diversos caracteres especiais com interpretação especial dentro de caracteres (strings). Eles são precedidos por uma barra invertida (escape). Os mais comuns são:

  • \' aspas simples

  • \" aspas duplas

  • \n quebra de lina ou nova linha

  • \\ a própria barra invertida

6.1.4 Lógico

Valores lógicos são um tipo de vetores atômicos extremamente úteis simples, pois só podem assumir os valores TRUE (verdadeiro), FALSE (falso) e NA. No eles são da classe de dados do tipo logical.

# variável lógica
vetor_log <- c(FALSE, NA, FALSE, TRUE)
vetor_log
#> [1] FALSE    NA FALSE  TRUE
class(vetor_log)
#> [1] "logical"

O aceita as abreviaturas T e F para representar TRUE e FALSE. Entretanto, esta não é uma prática recomendável, pois T e F não fazem parte das palavras reservadas do . Consequentemente isso pode levar a confusão, como no exemplo abaixo.

TRUE
#> [1] TRUE
T
#> [1] TRUE
class(T)
#> [1] "logical"
T <- 10
class(T)
#> [1] "numeric"
c(T, F)
#> [1] 10  0

Vetores lógicos resultam de comparações e são amplamente usados em estruturas de controle condicional do código (como por exemplo nas funções if() e ifelse()).


  1. Diferente de outras linguagens de programação no R, um escalar é um vetor com um elemento. Então, vetores são o menor tipo de dados no R.

  2. Lista é um tipo de vetor chamado list que é capaz de armazenar dados de diferentes tipos (heterogêneos), o que será visto na seção 8.1.

  3. Em comparação a função print(), a função cat() tem a vantagem de concatenar os dados fornecidos em seus argumentos, fazendo a coerção deles para caracteres se necessário. Isso faz dela uma função bastante útil para imprimir mensagens e avisos dentro de funções.