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.
| 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 |
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 2O
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 -
\nquebra 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 0Vetores 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()).
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.↩
Lista é um tipo de vetor chamado
listque é capaz de armazenar dados de diferentes tipos (heterogêneos), o que será visto na seção 8.1.↩Em comparação a função
print(), a funçãocat()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.↩