sum(1:10)
[1] 55
sum(NA)
[1] NA
sum(NA, na.rm = T)
[1] 0
Status 🟨🟨🟨
Nesta seção são detalhadas algumas das funções mais básicas para sumarização de dados.
A função sum
retorna a soma dos elementos informados como argumentos.
sum(1:10)
[1] 55
sum(NA)
[1] NA
sum(NA, na.rm = T)
[1] 0
mean(1:20)
[1] 10.5
mean(c(NA, 1, 2, 3))
[1] NA
mean(NA, na.rm = T)
[1] NaN
median(1:11)
[1] 6
median(c(NA, 1, 2, 3))
[1] NA
median(NA, na.rm = T)
[1] NA
max(99:15)
[1] 99
min(15:99)
[1] 15
Estas funções também oferecem o argumento na.rm
. Veja que vetores vazios recebem retornos Inf
e -Inf
.
max(c(NA, NA), na.rm = T)
Warning in max(c(NA, NA), na.rm = T): nenhum argumento não faltante para max;
retornando -Inf
[1] -Inf
min(c(NA, NA), na.rm = T)
Warning in min(c(NA, NA), na.rm = T): nenhum argumento não faltante para min;
retornando Inf
[1] Inf
Uma tarefa muito rotineira em análise de dados é a sumarização de valores por grupos de interesse.
Vejamos um exemplo na base Estatísticas de Aprovações - Por Porte de Empresa (BNDES). Uma informação de interesse, por exemplo, pode ser o valor total de Aprovações por ano para cada porte das empresas. Como a base de dados originalmente traz os valores abertos para cada mês, será necessária operação de agregação.
<-
df_aprovacoes_porte readRDS(
'./data/aprovacoes_por_porte_de_empresa.RDS')
|> head() df_aprovacoes_porte
ANO MES MICRO PEQUENA MEDIA GRANDE
1 1995 1 128.4699 0 10.18922 380.2330
2 1995 2 106.3283 0 16.21161 495.5282
3 1995 3 234.5488 0 13.69085 715.9591
4 1995 4 125.2196 0 16.44511 403.9919
5 1995 5 209.4168 0 20.88794 477.2529
6 1995 6 122.5179 0 23.86818 473.2194
Podemos então fazer a agregação usando a variável ANO como variável chave na função aggregate
. Esta função exige (dentre outros argumentos opcionais) um objeto sobre os quais a função informada será aplicada, uma lista de elementos para definir o agrupamento e a função a ser aplicada. No exemplo, usaremos a função sum
, que retorna a soma dos valores.
<-
somatorio aggregate(subset(df_aprovacoes_porte, select = c(-ANO, -MES)),
by = list(df_aprovacoes_porte$ANO),
sum)
head(somatorio)
Group.1 MICRO PEQUENA MEDIA GRANDE
1 1995 1711.645 0.000000 216.8279 7048.91
2 1996 1431.916 0.000000 271.6768 11362.08
3 1997 2179.985 1.053206 137.0893 16672.74
4 1998 1375.066 34.909957 1454.6207 20161.79
5 1999 1394.739 426.779631 1083.7491 16634.18
6 2000 2366.893 864.823930 1534.4957 22858.39
Veja que a função subset
foi usada pois as somas de ANO e MES não são de interesse aqui. Sem removê-las a função aggregate
faria a soma de seus valores.
A mesma operação pode ser feita usando o pipe:
|>
df_aprovacoes_porte subset(select = c(-ANO, -MES)) |>
aggregate(by = list(df_aprovacoes_porte$ANO),
|>
sum) head()
Group.1 MICRO PEQUENA MEDIA GRANDE
1 1995 1711.645 0.000000 216.8279 7048.91
2 1996 1431.916 0.000000 271.6768 11362.08
3 1997 2179.985 1.053206 137.0893 16672.74
4 1998 1375.066 34.909957 1454.6207 20161.79
5 1999 1394.739 426.779631 1083.7491 16634.18
6 2000 2366.893 864.823930 1534.4957 22858.39
Uma forma equivalente e ainda mais sucinta é possível com a utilização do .
(indicando todas as variáveis) e do ~
(indicando que as variáveis “dependem” ou são “explicadas” pela variável ANO). Como aqui a variável ANO será indicada como “explicativa” das demais ela não deve ser descartada no comando subset
, como feito no exemplo anterior.
|>
df_aprovacoes_porte subset(select = -MES) |>
aggregate(by = . ~ ANO, sum) |>
head()
ANO MICRO PEQUENA MEDIA GRANDE
1 1995 1711.645 0.000000 216.8279 7048.91
2 1996 1431.916 0.000000 271.6768 11362.08
3 1997 2179.985 1.053206 137.0893 16672.74
4 1998 1375.066 34.909957 1454.6207 20161.79
5 1999 1394.739 426.779631 1083.7491 16634.18
6 2000 2366.893 864.823930 1534.4957 22858.39
A função aggregate
possui como padrão o argumento na.action = na.omit
, assim os valores NA
são omitidos. Caso seja necessáiro considerar os valores faltantes deve ser informada uma função “alternativa”, que trata estes registros. No exemplo abaixo foi informado NULL
, ou seja, “nenhuma” função a ser aplicada sobre os valores faltantes. Assim eles serão considerados no cálculo.
<- df_aprovacoes_porte
df_aprovacoes_porte_na
1,]$MICRO <- NA
df_aprovacoes_porte_na[
head(df_aprovacoes_porte_na)
ANO MES MICRO PEQUENA MEDIA GRANDE
1 1995 1 NA 0 10.18922 380.2330
2 1995 2 106.3283 0 16.21161 495.5282
3 1995 3 234.5488 0 13.69085 715.9591
4 1995 4 125.2196 0 16.44511 403.9919
5 1995 5 209.4168 0 20.88794 477.2529
6 1995 6 122.5179 0 23.86818 473.2194
|>
df_aprovacoes_porte_na subset(select = -MES) |>
aggregate(by = . ~ ANO, sum,
na.action = NULL) |>
head()
ANO MICRO PEQUENA MEDIA GRANDE
1 1995 NA 0.000000 216.8279 7048.91
2 1996 1431.916 0.000000 271.6768 11362.08
3 1997 2179.985 1.053206 137.0893 16672.74
4 1998 1375.066 34.909957 1454.6207 20161.79
5 1999 1394.739 426.779631 1083.7491 16634.18
6 2000 2366.893 864.823930 1534.4957 22858.39
Veja que agora a soma para o ano de 1995 para o porte MICRO é NA
.
Caso seja inserido na.rm = T
como argumento da função sum
, os valores faltantes são desconsiderados novamente, mesmo na.action
sendo nulo.
|>
df_aprovacoes_porte_na subset(select = -MES) |>
aggregate(by = . ~ ANO, sum, na.rm = T,
na.action = NULL) |>
head()
ANO MICRO PEQUENA MEDIA GRANDE
1 1995 1583.175 0.000000 216.8279 7048.91
2 1996 1431.916 0.000000 271.6768 11362.08
3 1997 2179.985 1.053206 137.0893 16672.74
4 1998 1375.066 34.909957 1454.6207 20161.79
5 1999 1394.739 426.779631 1083.7491 16634.18
6 2000 2366.893 864.823930 1534.4957 22858.39
Última atualização: 11/10/2024 - 21:53:42