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.
## [1] "integer"
## [1] "numeric"
## [1] "character"
## [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"
## [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:
## [1] TRUE
## [1] TRUE
## [1] TRUE
## [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
## [1] TRUE
## [1] FALSE
## [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
## [1] 2
## [1] 0.5
## [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()eas.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"
## [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
## 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"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):
## [1] "character"
## [1] "character"
Porém, se convertermos esses objetos para a classe Date, então poderemos fazer operações matemáticas com eles:
data1 <- as.Date(data1, format = "%d/%m/%Y")
data2 <- as.Date(data2, format = "%d/%m/%Y")
# agora a classe mudou
class(data1)## [1] "Date"
## [1] "Date"
## 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
## [1] "2016-04-21"