6.4 Outros tipos de dados derivados
6.4.1 Fator
Em alguns casos variáveis do tipo caractere possuem uma ordem implícita. Este tipo de variável é geralmente chamada de categórica. Então qualquer variável que pode ser ordenada ou classificada em grupos pode ser representada como factor
no .
Podemos por exemplo classificar eventos de ocorrência de chuva por classe de intensidade:
intensidade <- factor(
x = c("baixa", "moderada", "alta")
)
intensidade
#> [1] baixa moderada alta
#> Levels: alta baixa moderada
Note que a impressão de um fator na tela é diferente da de um caractere. Ele é impresso sem as aspas e há uma segunda linha de informação sobre os níveis (levels) da variável intensidade
. Um fator possui o atributo adicional: níveis. Os níveis de um fator são obtidos com a função levels()
:
levels(intensidade)
#> [1] "alta" "baixa" "moderada"
Por padrão os níveis são definidos em ordem alfabética. Então "alta"
recebeu o índice 1
, "baixa"
o índice 2
e moderada
o índice 3
. Estes índices são mostrados com a função str()
ou convertendo um fator para numérico:
str(intensidade)
#> Factor w/ 3 levels "alta","baixa",..: 2 3 1
as.numeric(intensidade)
#> [1] 2 3 1
A função str()
é uma abreviação para structure
e serve para nos fornecer um resumo da estrutura dos dados.
No caso das intensidade, seria melhor que os níveis fossem ordenados como: baixa < moderada < alta
. Nós podemos especificar um fator ordenado ao , especificando no argumento levels
:
intensidade_o <- factor(
x = c("baixa", "moderada", "alta"),
levels = c("baixa", "moderada", "alta"),
ordered = TRUE
)
intensidade_o
#> [1] baixa moderada alta
#> Levels: baixa < moderada < alta
Fatores são úteis em alguns processos analíticos e gráficos. Para ilustrar um exemplo simples, suponha que o número de casos registrados em cada intensidade tenha sido:
n_casos <- c(90, 30, 5)
Poderíamos representar graficamente estas informações. Veja abaixo a diferença na ordem do eixo x, ao usar o fator intensidade
(ordem alfabética) e intensidade_o
(ordenado):
library(ggplot2)
qplot(x = intensidade, y = n_casos, geom = "col")
qplot(x = intensidade_o, y = n_casos, geom = "col")
Para verificar se uma variável é um fator e se esse fator é ordenado usamos, respectivamente:
is.factor(intensidade)
#> [1] TRUE
is.ordered(intensidade)
#> [1] FALSE
A coerção para fator é feita pela função as.factor
:
(intensidade_no <- as.factor(
c("baixa", "moderada", "alta", "baixa", "baixa", "moderada")
))
#> [1] baixa moderada alta baixa baixa moderada
#> Levels: alta baixa moderada
6.4.2 Datas e horários
Lidar com datas e horários pode ser difícil se não for usada uma estrutura de dados específica para isso. Entre as classes mais úteis para armazenar este tipo de informação, estão:
Date
: para combinar datas (anos, meses e dias)POSIXct
: para combinar datas e horas (horas, minutos e segundos)
Date
armazena apenas datas, enquanto POSIXct
armazena a datas associadas com horários. Ambos dados são representados como o número de dias (Date
) ou de segundos (POSIXct
) decorridos desde 1 de Janeiro de 1970.
Exemplos de cada um destes tipos de dados podem ser obtidos com o usando as funções internas Sys.Date()
e Sys.time()
que informam a data e a hora atual:
Sys.Date()
#> [1] "2021-01-29"
Sys.time()
#> [1] "2021-01-29 21:35:47 UTC"
As datas seguem o formato padrão de representação ISO-8601, ou seja o formato YYYY-MM-DD
para ano-mês-dia
, independente do local onde você mora.
Datas são criadas a partir da coerção de dados do tipo character
para date
:
amd <- as.Date("2012-06-28")
amd
#> [1] "2012-06-28"
class(amd)
#> [1] "Date"
# num. de dias de 1971
as.numeric(amd)
#> [1] 15519
Datas com horários são criados a partir da coerção de dados do tipo character
para POSIXct
:
amd_hms <- as.POSIXct("2012-06-28 17:42")
amd_hms
#> [1] "2012-06-28 17:42:00 UTC"
class(amd_hms)
#> [1] "POSIXct" "POSIXt"
as.numeric(amd_hms)
#> [1] 1340905320
A manipulação de dados da classe de datas com horários (POSIXct
) torna-se mais versátil através do pacote lubridate
, específico para manipulação de datas, o que será visto posteriormente.
O requer que o formato de entrada dos dados sejam especificados usando a %
e outros códigos que são descritos no manual de ajuda da função ?strptime
. O formato padrão assumido pelo R para caracteres contendo datas com horas é %Y-%m-%d %H:%M:%S
.
código | Significado | Intervalo |
---|---|---|
%Y | ano (incluindo século) | 1 - 9999 |
%m | mês | 01 - 12 |
%d | dia | 01 - 31 |
%H | hora | 00 - 23 |
%M | minuto | 00 - 59 |
%S | segundo | 00 - 59 |
Há vários outros códigos adicionais, por exemplo, para usar abreviações de meses como Jan
(%b
), e estes códigos são listados em ?strptime
.
Para extrair informações de uma data, como por exemplo o ano, podemos usar a função format()
passando o código de formato ao argumento format
.
format(x = Sys.Date(), format = "%Y")
#> [1] "2021"
O argumento format também pode ser especificado nas funções as.Date()
e as.POSIXct()
, assim provendo grande versatilidade para ler datas em diferentes formatos. No exemplo a seguir, vamos converter um caractere com as informações de data com horário armazenadas na ordem dia, mês, ano, hora, minuto e segundo, sem nenhum delimitador.
as.POSIXct(
x = "prec010120001942.grib",
tz = "UTC",
format = "prec%d%m%Y%H%M.grib"
)
#> [1] "2000-01-01 19:42:00 UTC"