# Séance 1 : Premiers pas avec R et RStudio
# Source : https://pierrebeaucoral.github.io/r-for-beginners/fr/
# Ouvrez votre projet r-course dans RStudio, puis exécutez ce fichier ligne par ligne.

library(tidyverse)
library(here)
library(scales)
source(here("R", "theme_cours.R"))
Sys.setenv(LANGUAGE = "en")  # messages d'erreur en anglais

# # Construit "<racine du projet>/data/wdi_panel.csv" sur n'importe quel ordinateur
# here::here("data", "wdi_panel.csv")
# 
# # Utilisé dans une fonction de lecture (séance 2)
# wdi <- read_csv(here::here("data", "wdi_panel.csv"))

# Un commentaire : R ignore cette ligne
2 + 2   # un commentaire peut aussi suivre du code

gdp_usa <- 20.9                                  # un nombre : PIB des États-Unis, milliers de milliards de US$, 2020
three_countries <- c("USA", "China", "India")    # un vecteur de textes (voir Vecteurs)
gdp_table <- tibble(country = three_countries,
                    gdp_bn  = c(20894, 14688, 2671))  # un tableau entier (voir Data frames)
gdp_sum <- sum(gdp_table$gdp_bn)                 # le résultat d'un calcul
my_mean <- mean                                  # même une fonction

gdp_usa            # taper le nom rappelle la valeur
gdp_table
my_mean(gdp_table$gdp_bn)   # my_mean fonctionne maintenant exactement comme mean

ls()

gdp_india <- 2671
gdp_three <- c(20894, 14688, 2671)
gdp_total <- sum(gdp_three)

gdp_total            # (b) rappel par le nom

largest <- max       # (c) une fonction rangée sous un nouveau nom
largest(gdp_three)

gdp_usa <- 20.9          # numeric (nombre)
country <- "United States"  # character (texte, toujours entre guillemets)
is_rich <- TRUE          # logical (TRUE ou FALSE, sans guillemets)

gdp_usa
country
is_rich

class(gdp_usa)
class(country)
class(is_rich)

3 + 5      # addition
10 - 4     # soustraction
6 * 7      # multiplication
20 / 4     # division
2^3        # puissance
17 %/% 5   # division entière
17 %% 5    # reste

3 == 3     # égal (deux signes égal !)
5 != 4     # différent
7 > 5
2 < 6
4 >= 4

TRUE & FALSE
TRUE | FALSE
!TRUE

sqrt(16)
round(3.14159, digits = 2)
round(3.14159, 2)      # idem, par position
mean(c(4, 8, 15, 16, 23, 42))

total_gdp <- sum(20.9, 14.7, 2.7)
total_gdp

pop_india <- 1380                     # millions, arrondi 2020
pop_three <- 331 + 1411 + pop_india   # calculé une fois, à partir de la valeur 1380
pop_india <- 1400                     # on modifie pop_india...
pop_three                             # ...pop_three contient toujours l'ancien total

# gdp_bn <- c(20894, 14688, 2671)          # PIB, milliards de US$, 2020
# gdp_pc <- gdp_bn * 1000 / pop_mn         # PIB par habitant, US$
# gdp_pc

try({
# gdp_bn <- c(20894, 14688, 2671)          # PIB, milliards de US$, 2020
# gdp_pc <- gdp_bn * 1000 / pop_mn         # PIB par habitant, US$
})

gdp_bn <- c(20894, 14688, 2671)          # PIB, milliards de US$, 2020
pop_mn <- c(331, 1411, 1380)             # population, millions, 2020
gdp_pc <- gdp_bn * 1000 / pop_mn         # PIB par habitant, US$
gdp_pc

# ?mean
# help("round")

# # Étape 1, une seule fois, dans la console : tous les packages utilisés dans ce cours
# install.packages(c(
#   "tidyverse", "here", "janitor", "readxl", "writexl", "lubridate", "scales",
#   "WDI", "gt", "fixest", "modelsummary", "ggrepel", "sf", "rnaturalearth",
#   "rnaturalearthdata", "patchwork", "plotly", "crosstalk", "shiny"
# ))
# 
# # Étape 2, en haut de chaque script
# library(tidyverse)

try({
# gdp_china <- 14.7
# gdp_chinaa + 1      # faute de frappe dans le nom
})

try({
# c(1 2 3)            # virgules manquantes
})

try({
# feols(gdp ~ year, data = tibble(gdp = 1:3, year = 1:3))
})

pop_text <- c("331", "1,411", "1380")   # des nombres stockés comme texte
as.numeric(pop_text)

gdp_3 <- read_csv(here("data", "wdi_3countries.csv"))

population <- c(331, 1411, 1380)             # numeric (nombres)
countries  <- c("USA", "China", "India")     # character (texte)
high_income <- c(TRUE, FALSE, FALSE)         # logical (vrai/faux)

1:10                      # entiers de 1 à 10
seq(1, 10, by = 2)        # pas de 2
seq(0, 1, length.out = 5) # 5 valeurs régulièrement espacées
rep(5, times = 3)
rep(c("a", "b"), each = 2)

population[2]                # deuxième élément
population[c(1, 3)]          # premier et troisième
population[-1]               # tous sauf le premier
population[population > 1000]  # éléments qui satisfont une condition
countries[population > 1000]   # un vecteur sert à filtrer un autre

population + 2
population * 1000000         # des millions aux personnes
population / sum(population) # part du total

tibble(country = countries, population = population,
       share = 100 * population / sum(population)) |>
  mutate(country = fct_reorder(country, share)) |>
  ggplot(aes(x = share, y = country)) +
  geom_col(fill = pal_cours[["principal"]]) +
  geom_text(aes(label = paste0(round(share), " %")), hjust = -0.2) +
  scale_x_continuous(limits = c(0, 55)) +
  labs(
    title = "La Chine et l'Inde concentrent 89 % de la population des trois pays",
    x = "Part de la population totale des trois pays (%)",
    y = NULL,
    caption = "Source : valeurs 2020 arrondies d'une version antérieure des WDI (Banque mondiale), à visée pédagogique."
  )

gini <- c(41.5, 38.2, NA, 35.7)
mean(gini)
mean(gini, na.rm = TRUE)   # na.rm = TRUE : retirer les NA avant le calcul
is.na(gini)
sum(is.na(gini))           # nombre de valeurs manquantes

read_csv(here("data", "wdi_panel.csv"), show_col_types = FALSE) |>
  filter(year == 2019, !is.na(income)) |>
  summarise(share_na = 100 * mean(is.na(gini)), .by = income) |>
  mutate(income = factor(income, levels = c("Low income", "Lower middle income",
                                            "Upper middle income", "High income"))) |>
  ggplot(aes(x = income, y = share_na)) +
  geom_col(fill = pal_cours[["accent"]]) +
  geom_text(aes(label = paste0(round(share_na), " %")), vjust = -0.4) +
  scale_y_continuous(limits = c(0, 100)) +
  labs(
    title = "Le Gini manque pour la plupart des pays une année donnée",
    x = "Groupe de revenu de la Banque mondiale (classification actuelle)",
    y = "Pays dont le Gini est manquant, 2019 (%)",
    caption = "Source : Banque mondiale, World Development Indicators (WDI), 2019."
  )

countries3 <- tibble(
  country    = c("United States", "China", "India"),
  gdp_bn     = c(20894, 14688, 2671),   # PIB, milliards de US$ courants, arrondi 2020
  pop_mn     = c(331, 1411, 1380),      # population, millions, arrondi 2020
  high_income = c(TRUE, FALSE, FALSE)
)
countries3

nrow(countries3)     # nombre de lignes
ncol(countries3)     # nombre de colonnes
names(countries3)    # noms des colonnes
str(countries3)      # structure : type de chaque colonne
summary(countries3)  # statistiques rapides par colonne
head(countries3, 2)  # 2 premières lignes

countries3$gdp_bn          # une colonne (un vecteur) avec $
countries3[1, ]            # première ligne, toutes les colonnes
countries3[ , "country"]   # toutes les lignes, une colonne
countries3[2, "pop_mn"]    # une cellule
countries3[countries3$pop_mn > 1380, ]  # lignes satisfaisant une condition

countries3$gdp_pc <- countries3$gdp_bn * 1000 / countries3$pop_mn
countries3

# Trier par PIB par habitant, du plus élevé au plus faible
countries3[order(countries3$gdp_pc, decreasing = TRUE), ]

# Garder uniquement les pays de plus de 1 000 millions d'habitants
countries3[countries3$pop_mn > 1000, ]

countries3[order(countries3$gdp_pc, decreasing = TRUE), c("country", "gdp_pc")]

countries3 |>
  mutate(country = fct_reorder(country, gdp_pc)) |>
  ggplot(aes(x = gdp_pc, y = country)) +
  geom_col(fill = pal_cours[["principal"]]) +
  geom_text(aes(label = label_dollar()(round(gdp_pc))), hjust = -0.1) +
  scale_x_continuous(limits = c(0, 80000), labels = label_dollar()) +
  labs(
    title = "Les États-Unis produisent six fois plus par habitant que la Chine",
    x = "PIB par habitant ($ courants, 2020)",
    y = NULL,
    caption = "Source : valeurs 2020 arrondies d'une version antérieure des WDI (Banque mondiale), à visée pédagogique."
  )

sqrt(sum(c(1, 4, 9)))          # imbriqué : à lire de l'intérieur vers l'extérieur

c(1, 4, 9) |> sum() |> sqrt()  # avec pipe : « prendre c(1, 4, 9), puis la somme, puis la racine carrée »

c(1, 4, 9)                     # étape 1 : les données
c(1, 4, 9) |> sum()            # étapes 1 et 2
c(1, 4, 9) |> sum() |> sqrt()  # la chaîne complète

my_age <- 25
my_name <- "Pierre"
is_student <- TRUE

my_age
my_name
is_student

class(my_age)
class(my_name)
class(is_student)

x <- 12
y <- 5

x + y
x - y
x * y
x / y

x > y
x %% y == 0   # FALSE : le reste est 2

# ?round

round(pi, digits = 3)

gdp_growth <- c(2.3, 5.1, NA, 3.8, -0.4)

mean(gdp_growth)                 # NA
mean(gdp_growth, na.rm = TRUE)   # 2,7

# Attention : comparer NA à 2 donne NA, donc on retire d'abord les NA
gdp_growth[!is.na(gdp_growth) & gdp_growth > 2]

v <- 1:10

v^2
v[v %% 2 == 0]
seq(1, 9, by = 2)

students <- tibble(
  name       = c("Alice", "Bob", "Charlie", "Dalia"),
  age        = c(19, 24, 31, 22),
  is_student = c(TRUE, TRUE, FALSE, TRUE)
)

students$age                       # (a)
students[1, ]                      # (b)
students[students$age > 20, ]      # (c) condition sur l'âge uniquement
students[order(students$age), ]    # (d)

countries3$gdp_share <- 100 * countries3$gdp_bn / sum(countries3$gdp_bn)

countries3[order(countries3$gdp_share, decreasing = TRUE),
           c("country", "gdp_share")]
