#-----------------------------------------------------------------------
#                                            Prof. Dr. Walmes M. Zeviani
#                                leg.ufpr.br/~walmes · github.com/walmes
#                                        walmes@ufpr.br · @walmeszeviani
#                      Laboratory of Statistics and Geoinformation (LEG)
#                Department of Statistics · Federal University of Paraná
#                                       2019-mai-25 · Curitiba/PR/Brazil
#-----------------------------------------------------------------------

#-----------------------------------------------------------------------
# Importação com o R.

library(tidyverse)

# 1. Fazer a importação do arquivo disponível em
#    <http://leg.ufpr.br/~walmes/data/euro_football_players.txt>.

# url <- "http://leg.ufpr.br/~walmes/data/euro_football_players.txt"
url <- "../data/euro_football_players.txt"
tb <- read_tsv(url, comment = "#")
attr(tb, "spec") <- NULL
str(tb)

# 2. Determinar o número de registros por pais (`country`).
tb %>%
    count(country, sort = TRUE)

# 3. Determinar o número de registros por time (`team`).
tb %>%
    count(team, sort = TRUE)

# 4. A média de idade (`age`) geral dos jogadores.
mean(tb$age, na.rm = TRUE)
tb$age %>% mean(na.rm = TRUE)
tb[["age"]] %>% mean(na.rm = TRUE)

# 5. A mediana de peso (`kg`) geral dos jogadores.
mean(tb$kg, na.rm = TRUE)
mean(tb$'kg', na.rm = TRUE)
mean(tb$`kg`, na.rm = TRUE)

# 6. Os percentis de 10 e 90% da distribuição da altura (`cm`).
quantile(tb$cm, probs = c(0.10,  0.90), na.rm = TRUE)

# 7. Obter a correlação entre peso e altura.
cor(tb[, c('kg', 'cm')], use = "complete")

# 8. A tupla do jogador com o maior número de gols (`goal`).
tb %>%
    arrange(desc(goal)) %>%
    head(n = 1) %>%
    t()

# 9. A tupla do jogador mais alto (`cm`).
tb %>%
    arrange(desc(cm)) %>%
    head(n = 1) %>%
    t()

# 10. Os 10 jogadores de maior rating (`rt`).
tb[, c("name", "team", "rt")] %>%
    arrange(desc(rt)) %>%
    head(n = 10)

# 11. Os 10 jogadores mais altos (`cm`).
tb[, c("name", "team", "cm")] %>%
    arrange(desc(cm)) %>%
    head(n = 10)

# 12. Filtrar para jogadores que entraram em campo (`apps` > 0).
anyNA(tb$apps)
tb$apps %>%
    is.na() %>%
    sum()

tb2 <- tb[!is.na(tb$apps), ]
tb2 <- tb %>%
    filter(!is.na(tb$apps))
dim(tb2)

# 13. Imputar 0 no lugar dos valores ausentes em cartões amarelos
#     (`yel`), vermelhos (`red`), gols (`goal`), e assistências a gol
#     (`ass`).
v <- c("yel", "red", "goal", "ass")
tb[, v] %>% is.na() %>% colSums()
tb[, v] <- tb[, v] %>%
    mutate_all(replace_na, replace = 0)
tb[, v] %>% is.na() %>% colSums()

# 14. Criar um variável com faixa de idade (`age`) em grupos de 5 anos.
range(tb$age, na.rm = TRUE)
tb$'faixaet' <- cut(x = tb$age,
                    breaks = c(15, 20, 25, 30, 35, 40, 45))

# Pode usar funções da numpy para criar sequências regulares.
seq(from = 15, to = 45, by = 5)

# 15. Determinar o número de jogadores em cada faixa de idade.
tb %>%
    count(faixaet)

# 16. Criar a variável índice de massa corporal.
tb$bmi <- tb$kg/(tb$cm/100)^2
mean(tb$bmi, na.rm = TRUE)

# 17. Criar as faixa de índice de massa corporal.
bns <- c(0, 18.5, 25, 30, 35, 40, Inf)
lbs <- c("Abaixo", "Normal", "Acima",
         "Obesidade I", "Obesidade II", "Obesidade III")

# Vetor de teste.
u <- c(18.4999, 18.5, 30, 50)
cut(x = u, breaks = bns, labels = lbs,
    include.lowest = TRUE, right = FALSE)

tb[['bmi_cls']] = cut(x = tb$bmi, breaks = bns, labels = lbs,
                      include.lowest = TRUE, right = FALSE)
u <- tb %>% count(bmi_cls)
u
tb$bmi_cls %>% fct_count()

u <- rename(u, "freq" = "n")

u[['freqrel']] = u$freq/sum(u$freq)
u

prop.table(u[, "freq"])

# 18. Obter a média de idade por time.
tb %>% group_by(country) %>% summarise_at("age", "mean", na.rm = TRUE)
tb %>% group_by(country) %>% summarise(age = mean(age, na.rm = TRUE))

# 19. Obter a mediana de peso por pais.
tb %>% group_by(country) %>% summarise_at("kg", "median", na.rm = TRUE)

# 20. Obter a média de altura por posição em que joga.
tb$pos %>% unique()
tb %>% group_by(pos) %>% summarise_at("cm", "mean", na.rm = TRUE)

# 21. Obter o rating médio por time.
tb %>% group_by(team) %>% summarise_at("rt", "mean", na.rm = TRUE)

# 22. Obter o jogador com mais gols em cada time.
tb %>%
    group_by(team) %>%
    top_n(goal, n = 1) %>%
    arrange(desc(goal)) %>%
    select(name, team, goal)

# 23. Obter a proporção de jogadores italianos por time.
tb %>%
    group_by(team) %>%
    summarise(prop_italiano = sum(is.element(country, set = "Italy"))/n())

# pd.crosstab(index = tb.team, columns = tb.country)
table(tb$team, is.element(tb$country, "Italy"))
table(tb$team, tb$country %in% "Italy")

# 24. Obter a média, desvio-padrão e amplitude para número de gols por
#     time.
rng <- function(x, ...) diff(range(x, ...))

tb %>%
    group_by(team) %>%
    summarise_at("goal", c("mean", "sd", "rng"))

# 25. Obter por time o total de gols, média de altura e amplitude de
#     `bmi`.
tb %>%
    group_by(team) %>%
    summarise(goal_tot = sum(goal, na.rm = TRUE),
              cm_med = mean(cm, na.rm = TRUE),
              bmi_amp = rng(bmi, na.rm = TRUE))

#-----------------------------------------------------------------------
# Extras.

# Converter todas com argumento na.rm a terem TRUE como default.
browseURL("https://stackoverflow.com/questions/17418640/is-it-possible-to-set-na-rm-to-true-globally")

# Algumas formas simples de imputar valores ausentes:
browseURL("https://cran.r-project.org/web/packages/na.tools/na.tools.pdf")

#-----------------------------------------------------------------------
