Tipos de dados
No R existem os seguintes tipos de dados e variáveis:
| Tipo de Dado | Exemplo |
|---|---|
| Lógico (Logic) | TRUE, FALSE |
| Numérico (Numeric) | 12.3, 5, 999 |
| Inteiro (Integer) | 2L, 34L, 0L |
| Complexo (Complex) | 1 + 2i |
| Caracter (Character) | ‘a’, “Bom dia”, “TRUE”, ‘23.4’ |
| (Raw) | “Bom dia” é armazenado como 42 6f 6d 20 64 69 61 |
Com estes dados (e variáveis) se pode construir objetos predefinidos e mais complexos: eles são os escalares* (scalars), vetores (vectors), matrizes (matrices), arrays (matrizes em dimensões maiores que m × n), data frames e listas (lists).
Observe que R é sensível ao caso. TESTE, Teste e teste são variáveis diferentes. Os valores lógicos devem ser escritos em maiúsculas (mas podem ser abreviados para T e F).
Com frequência mencionaremos o nome de uma entidade em inglês para facilitar a leitura dos textos abundantes na internet. Em alguns casos podemos manter a nomenclatura original, em inglês.
Variáveis e vetores
e <- 154 # um escalar, numérico
l <- "pedro" # um escalar, caracter
a <- c(1, 3, 9.5, 6, -2, 4) # vetor numérico
b <- c("um", "dois", "três") # vetor de caracter
c <- c(TRUE, TRUE, FALSE, TRUE, FALSE) # vetor lógico
Todos os componentes de um vetor devem ser do mesmo tipo.
> # um escalar pode ser criado assim:
> x <- 10
> x
[1] 10
> print(x)
[1] 10
> # um vetor é criado usando o operador c()
> vetor_numerico <- c(1.2, 3.4, 5, 7, 8)
> vetor_numerico
[1] 1.2 3.4 5.0 7.0 8.0
> vetor_string <- c("a", "b", "c", "d")
> vetor_string
[1] "a" "b" "c" "d"
> vetor_logico <- c(FALSE, TRUE, TRUE)
> vetor_logico
[1] FALSE TRUE TRUE
> vetor_inteiros <- c(12L, 15L, 18L)
> vetor_inteiros
[1] 12 15 18
> # a classe de um objeto pode ser consultada com a função class()
> class(vetor_inteiros)
[1] "integer"
> class(vetor_logico)
[1] "logical"
> # O primeiro componente do vetor_numerico é
> vetor_numerico[1]
[1] 1.2
> # Seu comprimento
> length(vetor_numerico)
[1] 5
> # Podemos então obter seu último componente
> vetor_numerico[length(vetor_numerico)]
[1] 8
> # O terceiro e o quinto componentes são
> vetor_numerico[c(3, 5)] # 2nd and 4th elements of vector
[1] 5 8
> # O vetor v = (1, 2, 3, 4, 5, 6) pode ser criado com
> v <- c(1:6)
> v
[1] 1 2 3 4 5 6
> # Desta forma podemos obter 4 (por ex.)
> # elementos sequenciados de vetor_numerico
> vetor_numerico[(1:4)]
[1] 1.2 3.4 5.0 7.0
# Um componente pode ser alterado a qualquer momento
> vetor_numerico[1] <- 0
> vetor_numerico
[1] 0.0 3.4 5.0 7.0 8.0
# Novos componentes podem ser inseridos
> vetor_numerico[6] <- 203
> vetor_numerico
[1] 0 3 5 7 8 203
> Observe que o operador c concatena vetores
> frutas <- c("maçã","laranja")
> verduras <- c("alface", "brocolis","couve")
> c(frutas, verduras)
[1] "maçã" "laranja" "alface" "brocolis" "couve"
> # Em R um objeto é dinâmicamente modificado para acomodar uma atribuição
> w <- 1:3
> w[7] <- 17
> w
[1] 1 2 3 NA NA NA 17
NA é uma constante interna representando um valor ausente ou não disponível, Not Available.Diferente do que ocorre na maioria das linguagens de programação os índices são contados à partir de 1 (e não 0).
Usamos os seguintes novos operadores:
| Operador | Efeito |
|---|---|
| v <- c(1:6) | cria* o vetor v = (1, 2, 3, 4, 5, 6) |
| v <- c(a1, ..., an) | cria o vetor v = (a1, ..., an), de comprimento n |
| v[r] | retorna o r-ésimo componente, ar, se r ≤ n, NA caso contrário |
| v[c(p, q)] | retorna componentes ap e aq |
| v[r] <- 5 | substitui o valor de ar se r ≤ n, insere caso contrário |
| lenght(v) | retorna o comprimento do vetor, lenght(v) = n neste caso. |
Como já foi usado acima, podemos filtrar um vetor para pegar apenas alguns de seus componentes. Para ilustrar esta operação vamos criar um longo vetor e, a partir dele construir outro vetor apenas com algumas de suas componentes:
> u <- 1:10 # forma resumida de c(1:10) > filtro <- c(T,T,T,F,F,F,T,T,T,F) # resumindo T = TRUE, F = FALSE > u[filtro] [1] 1 2 3 7 8 9 > # Observe ainda que podemos excluir o terceiro elemento > u[-3] [1] 1 2 4 5 6 7 8 9 10 > # ou todos os elementos entre o terceiro e o quinto, inclusive > u[-3:-5] [1] 1 2 6 7 8 9 10 > # Podemos atribuir este vetor filtrado a outra variável, para uso futuro > novo_u <- u[-3:-5] > # e remover o antigo, caso ele não seja mais necessário > rm(u) > # Se um valor for inserido o vetor muda de comprimento > u[12] <- 100 > u [1] 1 2 3 4 5 6 7 8 9 10 NA 100 > # A posição 11 fica indeterminada (NA) > # A função seq fornece uma forma adicional de criar um vetor > # onde se fornece os valores inicial e final e o acréscimo (ou passo) > v2 <- seq(from=0, to=3, by=.25) > v2 [1] 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 > # Um vetor pode ser repetido dentro de outro vetor maior > v <- 1:3 # um shortcut para c(1:3) > rep(v, times=3) [1] 1 2 3 1 2 3 1 2 3 # Para repetir cada componente 2 vezes > rep(v, each=2) [1] 1 1 2 2 3 3 > # Podemos especificar quantas vezes repetir cada componente > # No ex. abaixo repetir o primeiro componente 4 x, o segundo 2 > rep(c(0, 7), times = c(4,2)) [1] 0 0 0 0 7 7 > rep(v, times = c(1,0,3)) [1] 1 3 3 3 > # Repetir um vetor até obter outro de comprimento length.out > rep(v,length.out=7) [1] 1 2 3 1 2 3 1 > # Além das funções rep e seq podemos usar: > # any: testa se algum elemento do vetor satisfaz uma condição > any(v > 2) [1] TRUE > any(v >= 4) [1] FALSE > # all: testa se todos os elementos do vetor satisfazem uma condição > all(v > 2) [1] FALSE > all(v >= 0) [1] TRUE
Resumindo, usamos:
| Função | Efeito |
|---|---|
| rep(v, times = n) | repete o vetor v n vezes |
| rep(v, times = c(r, s)) | repete o primeiro componente r vezes, o segundo s vezes |
| rep(v, each = n) | repete o vetor v, cada componente n vezes |
| rep(v, lenght.out = l) | repete o vetor v até atingir um vetor de comprimento l |
| any(v condição) | verifica se algum componente de v satisfaz à condição |
| all(v condição) | verifica se todos os componentes de v satisfazem à condição |
Um vetor vazio pode ser criado através da função vector(). O vetor pode ser populado em seguida. Além disso vetores possuem o atributo names que é também um vetor. Ele permite atribuir nomes aos componentes do vetor, como mostrado abaixo:
> # Cria um vetor vazio (inicialmente um vetor lógico)
> v <- vector()
> v
logical(0)
> # Popula o vetor v
> v[1] <- 1
> v[2] <- 2
> v[3] <- 3
> v
[1] 1 2 3
> is.vector(v)
[1] TRUE
# Nenhum valor foi associado a names
> names(v)
NULL
> # Popula o vetor names associado a v
> names(v)[1] <- "primeiro"
> names(v)[2] <- "segundo"
> names(v)[3] <- "terceiro"
> v
primeiro segundo terceiro
1 2 3
> # Alternativamente
> names(v) <- c("um", "dois" ,"três")
> v
um dois três
1 2 3
> # O vetor continua sendo um vetor numérico
> class(v)
[1] "numeric"
> # Um vetor pode ser criado com seu atributo names definido
> v <- c('a'=1, 'b'=2, 'c'=3)
> names(v)
[1] "a" "b" "c"
> # As aspas acima são opcionais.
> # O mesmo efeito seria obtido com v <- c(a=1, b=2, c=3)
> v
a b c
1 2 3
> # Como dito, names é um vetor. Seu primeiro componente é
> names(v)[1]
[1] "a"
> # É possível obter o componente do vetor pelo seu atributo
> pessoa <- c("nome"="Pedro","Sobrenome"="Malazartes")
> pessoa["nome"]
nome
"Pedro"
Regras de reciclagem (recycling)
Vetores que aparecem um uma expressão não precisam, necessariamente, ter o mesmo comprimento. Caso um dos vetores seja de menor comprimento que o outro (ou outros) o resultado da expressão terá o comprimento do maior deles e os vetores menores serão reciclados (recycled). Na reciclagem eles são repetidos quantas vezes for necessário, podendo ser fracionados. Uma constante (um vetor de um elemento) é simplesmente repetido.
> u <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) > v <- c(1, 2, 3) > u + v [1] 2 4 6 5 7 9 8 10 12 11 > # v é reciclado para v' = (1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2) > u + 10 [1] 11 12 13 14 15 16 17 18 19 20