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.
# veja o help dessa funcao ?class
<- 1:20 # um vetor de números inteiros
v1 class(v1)
## [1] "integer"
<- seq(1, 10, by = 0.5) # um vetor de números
v2 class(v2)
## [1] "numeric"
<- rep(c("A", "B"), each = 10) # um vetor de palavras (character)
v3 class(v3)
## [1] "character"
<- c(T, T, F, F) # um vetor lógico
v4 class(v4)
## [1] "logical"
<- c(10, "A", 20, "B") # um vetor com misto de números e letras será convertido para texto
v4 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:
<- 1:20 # um vetor de números inteiros
v1 is.integer(v1) # verdadeiro
## [1] TRUE
is.numeric(v1) # também verdadeiro porque números inteiros também são números
## [1] TRUE
<- rep(c("A", "B"), each = 10) # um vetor de palavras
v3 is.character(v3) # verdadeiro
## [1] TRUE
is.numeric(v3) # falso, porque o vetor contém palavras
## [1] FALSE
<- c(10, "A", 20, "B") # um vetor com misto de números e letras
v4 is.numeric(v4) # falso, porque o vetor contém apenas palavras
## [1] FALSE
<- c(T, T, F, F) # um vetor lógico
v4 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
<- 1:20 # um vetor de números inteiros
v1 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
<- c(10, "A", 20, "B") # um vetor com misto de números e letras
v4 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
<- rep(c("A", "B"), each = 10) # um vetor de palavras
v3 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
<- c(T, T, F, F) # um vetor lógico
v4 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()
eas.vector()
- para converter entre fator e vetor.
# um exemplo de um vetor de palavras
<- c("abacate", "banama", "mamão", "uva")
mvv # repetindo cada fruta 3 vezes
<- rep(mvv, each = 3)
mvv # 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
<- as.factor(mvv)
mvv2 class(mvv2) # de fato mudou para factor
## [1] "factor"
# compare a estrutura deste objeto com mvv (apareceu a a palavra Levels:, que mostra as categorias existentes no fator) mvv2
## [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
# veja como mudaram as categorias e os valores mvv2
## [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?
<- "31/03/1964"
data1 <- "17/04/2016" data2
# eu nao posso simplesmente subtrair esses valores
- data1 data2
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
# veja o help dessa função ?as.Date
<- as.Date(data1, format = "%d/%m/%Y")
data1 <- as.Date(data2, format = "%d/%m/%Y")
data2 # agora a classe mudou
class(data1)
## [1] "Date"
class(data2)
## [1] "Date"
# posso fazer matemática com data
- data1 data2
## Time difference of 19010 days
# note o argumento format, ele importa para o R possa entender o formato de sua data
<- "2016-04-21" # formato americano
data3 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