2.4 Classes de vetores e fatores

Para entender os conceitos, vamos primeiro conhecer algumas funções úteis no entendimento das classes de objetos do R e algumas funções importantes: class(), is.[class]() e as.[class]().

Vetores têm classes diferentes e todos os elementos de um vetor pertencem à mesma classe.

As principais classes são:

  • numeric (=double, i.e. inclui casas decimais);

  • integer (numérico mas de valor inteiro);

  • character (texto);

  • logical (verdadeiro ou falso);

  • date (para datas).

A função class() nos permite saber a classe de um objeto do R.

?class # veja o help dessa funcao
v1 <- 1:20 # um vetor de números inteiros
class(v1)
## [1] "integer"
v2 <- seq(1, 10, by = 0.5) # um vetor de números
class(v2)
## [1] "numeric"
v3 <- rep(c("A", "B"), each = 10) # um vetor de palavras (character)
class(v3)
## [1] "character"
v4 <- c(T, T, F, F) # um vetor lógico
class(v4)
## [1] "logical"
v4 <- c(10, "A", 20, "B") # um vetor com misto de números e letras será convertido para texto
class(v4)
## [1] "character"
v4
## [1] "10" "A"  "20" "B"
# veja que em v4 os elementos 10 e 20 viraram palavras, porque vetor só aceita elementos da mesma classe e enquanto um número pode ser convertido em texto, um texto não pode ser convertido em número. Por isso tudo é convertido para texto para a informação seja perdida (i.e. vire NA)

As funções genéricas is.[class]() permitem você perguntar se um vetor é de uma determinada classe (is?). Ao utilizar essas funções, o R retornará um vetor lógico, ou seja, verdadeiro ou falso dependendo da classe do objeto:

v1 <- 1:20 # um vetor de números inteiros
is.integer(v1) # verdadeiro
## [1] TRUE
is.numeric(v1) # também verdadeiro porque números inteiros também são números
## [1] TRUE
v3 <- rep(c("A", "B"), each = 10) # um vetor de palavras
is.character(v3) # verdadeiro
## [1] TRUE
is.numeric(v3) # falso, porque o vetor contém palavras
## [1] FALSE
v4 <- c(10, "A", 20, "B") # um vetor com misto de números e letras
is.numeric(v4) # falso, porque o vetor contém apenas palavras
## [1] FALSE
v4 <- c(T, T, F, F) # um vetor lógico
is.logical(v4) # verdadeiro
## [1] TRUE
is.numeric(v4) # falso
## [1] FALSE
is.character(v4) # falso
## [1] FALSE

As funções genéricas as.[class]() (as = ‘como uma?’) permitem você converter um vetor de uma classe para outra. Em alguns casos, isso faz sentido; em outros, o retorno será de valores inexistentes (NA) ou não numéricos (NaN).

# conversão total
v1 <- 1:20 # um vetor de números inteiros
as.character(v1) # converte para texto um vetor numérico
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15"
## [16] "16" "17" "18" "19" "20"
# conversão parcial
v4 <- c(10, "A", 20, "B") # um vetor com misto de números e letras
as.numeric(v4) # converte cada elemento separadamente (regra da reciclagem é aplicada), o R vai conseguir mudar os textos que são números, mas as letras serão substituídas por NA e um aviso será dado quando isso acontecer
## Warning: NAs introduced by coercion
## [1] 10 NA 20 NA
# um vetor de texto não pode virar número
v3 <- rep(c("A", "B"), each = 10) # um vetor de palavras
as.numeric(v3) # todos viram NA pois a conversão é inválida
## Warning: NAs introduced by coercion
##  [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
# mas um vetor lógico pode virar número
v4 <- c(T, T, F, F) # um vetor lógico
as.numeric(v4) # verdadeiro vira 1 e falso vira 0 - isso é muito útil e é por isso que operações matemáticas funcionam com vetores lógicos:
## [1] 1 1 0 0
sum(v4)
## [1] 2
mean(v4)
## [1] 0.5
min(v4)
## [1] 0

O factor (=fator) na linguagem do R é um tipo especial de vetor com elementos de texto (classe character), em que os valores de texto são categorias. Isso tem algumas vantagens operacionais e sempre que o R precisa de um vetor de texto no formato de factor, ele converte automaticamente (se possível). No entanto, é muito importante que você entenda a diferença entre um vetor de classe character e um vetor de classe factor. Isso vai aparecer o tempo todo enquanto você usa o R e algumas vezes você precisará converter de um para outro. Funções importantes a serem memorizadas são:

  • levels() - para ver (ou modificar) os níveis ou categorias de um fator;

  • as.factor() e as.vector() - para converter entre fator e vetor.

# um exemplo de um vetor de palavras
mvv <- c("abacate", "banama", "mamão", "uva")
# repetindo cada fruta 3 vezes
mvv <- rep(mvv, each = 3)
# veja conteúdo
mvv
##  [1] "abacate" "abacate" "abacate" "banama"  "banama"  "banama"  "mamão"  
##  [8] "mamão"   "mamão"   "uva"     "uva"     "uva"
# qual a classe desse vetor?
class(mvv)
## [1] "character"
# vamos converter esse vetor de character para um fator
mvv2 <- as.factor(mvv)
class(mvv2) # de fato mudou para factor
## [1] "factor"
mvv2 # compare a estrutura deste objeto com mvv (apareceu a a palavra Levels:, que mostra as categorias existentes no fator)
##  [1] abacate abacate abacate banama  banama  banama  mamão   mamão   mamão  
## [10] uva     uva     uva    
## Levels: abacate banama mamão uva
# por ser um fator você pode
levels(mvv2) # você pode ver os níveis do fator, ou seja as categorias que ele contém)
## [1] "abacate" "banama"  "mamão"   "uva"
levels(mvv2) <- c("abacate", "banana", "mamão", "uva") # você pode mudar/corrigir os níveis, aqui corrigindo banama por banana
mvv2 # veja como mudaram as categorias e os valores
##  [1] abacate abacate abacate banana  banana  banana  mamão   mamão   mamão  
## [10] uva     uva     uva    
## Levels: abacate banana mamão uva
as.numeric(mvv2) # você pode converter o fator em numérico, de forma que cada categoria vire um número (muito útil isso)
##  [1] 1 1 1 2 2 2 3 3 3 4 4 4
as.numeric(mvv) # nao pode fazer a mesma coisa com um vetor de palavras
## Warning: NAs introduced by coercion
##  [1] NA NA NA NA NA NA NA NA NA NA NA NA

A função as.Date() converte um vetor de trecho em um objeto de classe date. Datas são uma classe especial, que permite operações artiméticas para calcular distâncias temporais.

# muitas vezes queremos calcular tempo entre duas observações, como por exemplo, entre duas medições consecutivas num estudo sobre crescimento de plantas

# Qual a diferença em dias entre duas datas?
data1 <- "31/03/1964"
data2 <- "17/04/2016"
# eu nao posso simplesmente subtrair esses valores
data2 - data1

O R retorna uma mensagem de erro (Error in data2 - data1 : non-numeric argument to binary operator) porque esses objetos são de classe texto, e operações matemáticas só são permitidas com números ou datas. Vejam que a classe dos objetos criados acima são do tipo “texto” (character):

class(data1)
## [1] "character"
class(data2)
## [1] "character"

Porém, se convertermos esses objetos para a classe Date, então poderemos fazer operações matemáticas com eles:

# mas o R tem um classe para datas
# entao fazemos a conversao
?as.Date # veja o help dessa função
data1 <- as.Date(data1, format = "%d/%m/%Y")
data2 <- as.Date(data2, format = "%d/%m/%Y")
# agora a classe mudou
class(data1)
## [1] "Date"
class(data2)
## [1] "Date"
# posso fazer matemática com data
data2 - data1
## Time difference of 19010 days
# note o argumento format, ele importa para o R possa entender o formato de sua data
data3 <- "2016-04-21" # formato americano
as.Date(data3, format = "%d/%m/%Y") # se eu usasse isso com o mesmo formato acima, o resultado é NA, porque está mal especificado
## [1] NA
# mas mudando a simbologia do argumento format
as.Date(data3, format = "%Y-%m-%d")
## [1] "2016-04-21"
# ele reconhece