---
title: "China–United States Trade War: Facts and Figures" 
subtitle: "R for Pleasure"
author: "Nguyen Chi Dung"
output:
  html_document: 
    code_download: true
    code_folding: hide
    highlight: pygments
    # number_sections: yes
    theme: "flatly"
    toc: TRUE
    toc_float: TRUE
---

```{r setup,include=FALSE}
knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)
```

# China–United States Trade War by Figures


```{r}

# Cào dữ liệu từ US Census Bureau và xử lí thô: 
rm(list = ls())
library(rvest)
library(tidyverse)
library(magrittr)
library(lubridate)


my_link <- "https://www.census.gov/foreign-trade/balance/c5700.html?fbclid=IwAR1Ow1t4V33vpLMsC8kI5gdzy11Wg-0iadbaWE33DhbOiRUatCWlrFqooW0"

my_link %>% 
  read_html() %>% 
  html_nodes("td") %>% 
  html_text() %>% 
  matrix(ncol = 4, byrow = TRUE) %>% 
  as.data.frame() -> df_import


names(df_import) <- c("month_year", "import", "export", "balance")


# Viết một số hàm phụ trợ: 

convert_to_num <- function(x) {
  x %>% 
    as.character() %>% 
    str_replace_all("[^0-9]", "") %>% 
    as.numeric() / 10 -> y
  
  return(y)
}


retain_cha <- function(x) {
  x %>% 
    as.character() %>% 
    str_replace_all("[0-9]", "") %>% 
    str_squish() %>% 
    return()
}


retain_num <- function(x) {
  x %>% 
    as.character() %>% 
    str_replace_all("[^0-9]", "") %>% 
    str_squish() %>% 
    as.numeric() %>% 
    return()
}


# Sử dụng các hàm ở trên: 

df_import %>% 
  mutate(thang = retain_cha(month_year), 
         nam = retain_num(month_year), 
         import = convert_to_num(import), 
         export = convert_to_num(export), 
         balance = import - export, 
         month_year = NULL) %>% 
  filter(thang != "TOTAL", nam != 2019) -> df_import

# Chỉ lấy ra một số năm: 
df_import_mini <- df_import %>% filter(nam %in% c(2000:2018))

n_thang <- nrow(df_import_mini)

my_ymd <- ymd("2000-01-01") + months(1:n_thang) - days(1)

df_ymd <- data.frame(yymmdd = my_ymd)

df_ymd %<>% 
  mutate(thang = month(yymmdd, label = TRUE, abbr = FALSE) %>% as.character(), 
         nam = year(yymmdd))

right_join(df_import, df_ymd, by = c("thang", "nam")) -> df_import_ymd



# Facts and Figures: 
library(highcharter)

highchart(type = "stock") %>% 
  hc_title(text = "US Trade with China from 2000 to 2018") %>% 
  hc_subtitle(text = "Note: All figures are in millions of U.S. dollars on a nominal basis.") %>% 
  hc_credits(enabled = TRUE,
             text = "Data Source: https://www.census.gov",  
             style = list(fontSize = "14px")) %>% 
  hc_tooltip(valueDecimals = 2) %>% 
  hc_add_series_times_values(df_import_ymd$yymmdd,
                             df_import_ymd$import,
                             name = "Exports to China") %>% 
  hc_add_series_times_values(df_import_ymd$yymmdd,
                             df_import_ymd$export,
                             name = "Import from China")  %>% 
  hc_add_theme(hc_theme_sandsignika())



```

