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 |
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()
).
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
list
que é 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.↩