7.13 Frequência de ocorrência de dados discretos

Uma forma muito comum de resumir dados é contar quantos valores de uma variável caem dentro de diferentes classes ou intervalos. Podemos usar o exemplo anterior para contabilizar a duração de cada evento através da função table().

evts_id
#>  [1]  1  1  1 NA NA NA NA NA  2  2  2  2  2  2  2 NA NA NA NA NA NA  3 NA  4
freq_tab <- table(evts_id)
freq_tab
#> evts_id
#> 1 2 3 4 
#> 3 7 1 1
names(freq_tab)
#> [1] "1" "2" "3" "4"

Quando aplicada a dados numéricos, a função table() retorna o número de vezes que cada valor único aparece. Os nomes correspondem aos diferentes valores individuais. Neste caso, o número de ocorrências de cada eventos corresponde a duração deles.

Por padrão, a table() não incluirá valores faltantes. Se for de interesse incluí-los, use o argumento exclude = NULL.

table(evts_id, exclude = NULL)
#> evts_id
#>    1    2    3    4 <NA> 
#>    3    7    1    1   12

A saída da função table() é um objeto do tipo table. O que pode ser tratado como um vetor com nomes.

class(freq_tab)
#> [1] "table"

Eventualmente você pode querer esta tabela na forma de um vetor, o que pode ser realizado simplemente concatenando a tabela:

c(freq_tab)
#> 1 2 3 4 
#> 3 7 1 1

Alternativamente é possível converter a tabela em um quadro de dados (data.frame, estrutura de dados que será vista posteriormente).

as.data.frame(freq_tab)
#>   evts_id Freq
#> 1       1    3
#> 2       2    7
#> 3       3    1
#> 4       4    1

A função table() pode lidar com mais de um vetor. Por exemplo, podemos contar o números que foram acima ou abaixo da normal climatológica com a seguinte expressão:

freq_prec <- table(Prec_acima_normal = prec > mean(prec_clim),
      mes = format(dts, "%m"))
freq_prec
#>                  mes
#> Prec_acima_normal 01 02 03 04 05 06 07 08 09 10 11 12
#>             FALSE  0  0  0  2  2  2  2  2  2  1  1  0
#>             TRUE   2  2  2  0  0  0  0  0  0  1  1  2
#ftable

Verifica-se que somente os meses de Dezembro e de Janeiro Março foram acima da normal climatológica mensal nos 2 anos. Enquanto Outubro e Novembro foram somente em 1 dos 2 anos de dados.

Outra função útil neste contexto é a cut(). Ela separa os dados em classes ou intervalos.

prec_classes <- cut(prec, breaks = seq(0, 250, by = 50))
prec_classes
#>  [1] (200,250] (200,250] (150,200] (50,100]  (50,100]  (0,50]    (0,50]   
#>  [8] (50,100]  (100,150] (150,200] (150,200] (200,250] (200,250] (150,200]
#> [15] (200,250] (0,50]    <NA>      (0,50]    (0,50]    (0,50]    (50,100] 
#> [22] (100,150] (0,50]    (200,250]
#> Levels: (0,50] (50,100] (100,150] (150,200] (200,250]
table(prec_classes)
#> prec_classes
#>    (0,50]  (50,100] (100,150] (150,200] (200,250] 
#>         7         4         2         4         6