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.

Tabela 6.2: Códigos de formato de datas e horas.
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"