#############################
# Cid Edson Mendonça Póvoas #
#############################

# Função summy  

summy <- function(x, num_var, ..., digit=2){
  options(tidyverse.quiet = TRUE)
  if(!require(tidyverse))
    install.packages("tidyverse")
  library(tidyverse)
  group_var <- quos(...)
  num_var <- enquo(num_var)
  x %>%
    dplyr::group_by(!!!group_var) %>%
    dplyr::summarize(n = n(), 
                     min = min(!!num_var, na.rm = T),
                     mean = mean(!!num_var, na.rm = T), 
                     max = max(!!num_var, na.rm = T),
                     sd = sd(!!num_var, na.rm = T),
                     se = sd/sqrt(n),
                     var = var(!!num_var, na.rm = T),
                     "cv(%)" = (sd/mean)*100,
                     sum = sum(!!num_var, na.rm = T)) %>% 
    mutate_if(is.numeric,round,digit)
}



# Criando banco de dados

state <- c("tas", "sa",  "qld", "nsw", "nsw", "nt",  "wa",  "wa",
           "qld", "vic", "nsw", "vic", "qld", "qld", "sa",  "tas",
           "sa",  "nt",  "wa",  "vic", "qld", "nsw", "nsw", "wa",
           "sa",  "act", "nsw", "vic", "vic", "act")

incomes <- c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56,
             61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46,
             59, 46, 58, 43)

df <- data.frame(state,incomes)


#Utilizando a função com 1 digito
summy(df,incomes,state,digit = 1) |> as.data.frame()
## Loading required package: tidyverse
## Warning: package 'ggplot2' was built under R version 4.1.3
## Warning: package 'tibble' was built under R version 4.1.3
## Warning: package 'dplyr' was built under R version 4.1.3
##   state n min mean max   sd  se   var cv(%) sum
## 1   act 2  43 44.5  46  2.1 1.5   4.5   4.8  89
## 2   nsw 6  41 57.3  70 10.6 4.3 111.5  18.4 344
## 3    nt 2  51 55.5  60  6.4 4.5  40.5  11.5 111
## 4   qld 5  40 53.6  62  9.2 4.1  84.3  17.1 268
## 5    sa 4  49 55.0  61  5.5 2.7  30.0  10.0 220
## 6   tas 2  60 60.5  61  0.7 0.5   0.5   1.2 121
## 7   vic 5  42 56.0  69 11.7 5.2 137.5  20.9 280
## 8    wa 4  48 52.2  59  5.3 2.7  28.2  10.2 209
# usando o objeto iris, com o padrão de 2 digitos

summy(iris, Sepal.Length, Species) |> as.data.frame()
##      Species  n min mean max   sd   se  var cv(%)   sum
## 1     setosa 50 4.3 5.01 5.8 0.35 0.05 0.12  7.04 250.3
## 2 versicolor 50 4.9 5.94 7.0 0.52 0.07 0.27  8.70 296.8
## 3  virginica 50 4.9 6.59 7.9 0.64 0.09 0.40  9.65 329.4
#utilizando o pipe ("|>") a com 4 digitos...

iris |> summy(Sepal.Length, Species, digit = 4) |> as.data.frame()
##      Species  n min  mean max     sd     se    var  cv(%)   sum
## 1     setosa 50 4.3 5.006 5.8 0.3525 0.0498 0.1242 7.0413 250.3
## 2 versicolor 50 4.9 5.936 7.0 0.5162 0.0730 0.2664 8.6956 296.8
## 3  virginica 50 4.9 6.588 7.9 0.6359 0.0899 0.4043 9.6521 329.4