#Practice R

Thực hành theo báo cáo của PCI 2018

Bài thực hành được lấy từ Báo cáo PCI2018. Bài tuy còn nhiều thiếu sót nhưng các bạn cũng có thể tham khảo nhé.

Bài viết này được tham khảo trong quá trình học tập bởi Thầy Nguyễn Chí Dũng!

library(readxl)
library(viridis)
library(tidyverse)


rm(list = ls())

df_raw <- read_excel("D:\\R\\Day3\\du-lieu-pci-2018.xlsx")

df_raw %>% slice(1:63) %>% select(1:3) -> df_raw

#rename
names(df_raw) <- c("Province", "Rank", "Score")

df_raw %>% 
  mutate(Province = case_when(str_detect(Province, "BRVT") ~ "Bà Rịa - Vũng Tàu",
                              TRUE ~ Province)) %>%
  mutate(Rank_m = case_when(Rank < 10 ~ paste0("0", Rank), TRUE ~ as.character(Rank))) %>% 
  mutate(Province = paste(Province, Rank_m)) %>% 
  mutate(df_sort = case_when(Rank <= 2 ~ "Rất tốt",
                             Rank >= 3 & Rank <= 9 ~ "Tốt",
                             Rank >= 10 & Rank <= 41 ~ "Khá",
                             Rank >= 42 & Rank <= 61 ~ "Trung Bình",
                             TRUE ~ "Thấp")) %>% arrange(-Rank) -> df_raw

df_raw %>% 
  mutate(Province = factor(Province, levels = Province)) %>% 
  mutate(df_sort = factor(df_sort, levels = df_sort %>% unique() %>% .[5:1]))-> df_raw
  
df_raw %>% 
  mutate(mix = round(Score, 2) %>% as.character()) %>% 
  mutate(mix = case_when(str_count(mix) == 2 ~ paste0(mix, ".00"),
                             str_count(mix) == 4 ~ paste0(mix, "0"),
                             TRUE ~ mix))-> df_final
  
#plots

my_font <- "Roboto Condensed"


df_final %>% 
  ggplot(aes(x = Province, y = Score, fill = df_sort)) +
  geom_col(width = 0.75) +
  coord_flip() +
  scale_fill_viridis(discrete = TRUE, name = "", option = "D")+
  geom_text(aes(label = mix), size = 2.5, hjust = -0.2) +
  scale_y_continuous(limits = c(0,80), expand = c(0,0)) +
  theme_minimal() +
  theme(axis.text.x = element_blank()) +
  theme(axis.text.y = element_text(size = 6.4, family = my_font, color = "black")) +
  theme(axis.ticks.y = element_blank()) +
  theme(panel.grid = element_blank()) +
  theme(axis.title = element_blank()) +
  theme(panel.border = element_blank()) +
  theme(plot.title = element_text(family = my_font, color = "grey20", size = 22,
                                  face = "bold")) +
  theme(plot.caption = element_text(family = my_font, size = 11, colour = "grey20", face = "italic")) +
  theme(legend.text = element_text(family = my_font, size = 10)) +
  theme(plot.margin = unit(c(1, 1, 1, 2), "cm")) +
  labs(x= NULL, y = NULL,
       title = "Vietnam CPI Index 2018",
       caption = "Data Source: http://pci2018.pcivietnam.vn")

LS0tDQp0aXRsZTogIlByYWN0aWNlOiBNYXBwaW5nIFZpZXRuYW0gUENJIEluZGV4IDIwMTgiDQphdXRob3I6ICJOZ3V5ZW4gVGhpIE5nb2MgSHV5ZW4iDQpkYXRlOiAiMS8xMC8yMDIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgIyBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLnJldGluYT0yKQ0KDQpgYGANCg0KI1ByYWN0aWNlIFINCg0KIyBUaOG7sWMgaMOgbmggdGhlbyBiw6FvIGPDoW8gY+G7p2EgUENJIDIwMTgNCg0KQsOgaSB0aOG7sWMgaMOgbmggxJHGsOG7o2MgbOG6pXkgdOG7qyBCw6FvIGPDoW8gW1BDSTIwMThdKGh0dHA6Ly9wY2kyMDE4LnBjaXZpZXRuYW0udm4vdXBsb2Fkcy8yMDE5L2hvLXNvLTYzLXRpbmgtdmllLnBkZikuIELDoGkgdHV5IGPDsm4gbmhp4buBdSB0aGnhur91IHPDs3QgbmjGsG5nIGPDoWMgYuG6oW4gY8WpbmcgY8OzIHRo4buDIHRoYW0ga2jhuqNvIG5ow6kuDQoNCkLDoGkgdmnhur90IG7DoHkgxJHGsOG7o2MgdGhhbSBraOG6o28gdHJvbmcgcXXDoSB0csOsbmggaOG7jWMgdOG6rXAgYuG7n2kgVGjhuqd5IE5ndXnhu4VuIENow60gRMWpbmchDQoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQoNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCg0Kcm0obGlzdCA9IGxzKCkpDQoNCmRmX3JhdyA8LSByZWFkX2V4Y2VsKCJEOlxcUlxcRGF5M1xcZHUtbGlldS1wY2ktMjAxOC54bHN4IikNCg0KZGZfcmF3ICU+JSBzbGljZSgxOjYzKSAlPiUgc2VsZWN0KDE6MykgLT4gZGZfcmF3DQoNCiNyZW5hbWUNCm5hbWVzKGRmX3JhdykgPC0gYygiUHJvdmluY2UiLCAiUmFuayIsICJTY29yZSIpDQoNCmRmX3JhdyAlPiUgDQogIG11dGF0ZShQcm92aW5jZSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KFByb3ZpbmNlLCAiQlJWVCIpIH4gIkLDoCBS4buLYSAtIFbFqW5nIFTDoHUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFByb3ZpbmNlKSkgJT4lDQogIG11dGF0ZShSYW5rX20gPSBjYXNlX3doZW4oUmFuayA8IDEwIH4gcGFzdGUwKCIwIiwgUmFuayksIFRSVUUgfiBhcy5jaGFyYWN0ZXIoUmFuaykpKSAlPiUgDQogIG11dGF0ZShQcm92aW5jZSA9IHBhc3RlKFByb3ZpbmNlLCBSYW5rX20pKSAlPiUgDQogIG11dGF0ZShkZl9zb3J0ID0gY2FzZV93aGVuKFJhbmsgPD0gMiB+ICJS4bqldCB04buRdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmsgPj0gMyAmIFJhbmsgPD0gOSB+ICJU4buRdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmsgPj0gMTAgJiBSYW5rIDw9IDQxIH4gIktow6EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5rID49IDQyICYgUmFuayA8PSA2MSB+ICJUcnVuZyBCw6xuaCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiVGjhuqVwIikpICU+JSBhcnJhbmdlKC1SYW5rKSAtPiBkZl9yYXcNCg0KZGZfcmF3ICU+JSANCiAgbXV0YXRlKFByb3ZpbmNlID0gZmFjdG9yKFByb3ZpbmNlLCBsZXZlbHMgPSBQcm92aW5jZSkpICU+JSANCiAgbXV0YXRlKGRmX3NvcnQgPSBmYWN0b3IoZGZfc29ydCwgbGV2ZWxzID0gZGZfc29ydCAlPiUgdW5pcXVlKCkgJT4lIC5bNToxXSkpLT4gZGZfcmF3DQogIA0KZGZfcmF3ICU+JSANCiAgbXV0YXRlKG1peCA9IHJvdW5kKFNjb3JlLCAyKSAlPiUgYXMuY2hhcmFjdGVyKCkpICU+JSANCiAgbXV0YXRlKG1peCA9IGNhc2Vfd2hlbihzdHJfY291bnQobWl4KSA9PSAyIH4gcGFzdGUwKG1peCwgIi4wMCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfY291bnQobWl4KSA9PSA0IH4gcGFzdGUwKG1peCwgIjAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IG1peCkpLT4gZGZfZmluYWwNCiAgDQojcGxvdHMNCg0KbXlfZm9udCA8LSAiUm9ib3RvIENvbmRlbnNlZCINCg0KDQpkZl9maW5hbCAlPiUgDQogIGdncGxvdChhZXMoeCA9IFByb3ZpbmNlLCB5ID0gU2NvcmUsIGZpbGwgPSBkZl9zb3J0KSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDAuNzUpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgbmFtZSA9ICIiLCBvcHRpb24gPSAiRCIpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbWl4KSwgc2l6ZSA9IDIuNSwgaGp1c3QgPSAtMC4yKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsODApLCBleHBhbmQgPSBjKDAsMCkpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNCwgZmFtaWx5ID0gbXlfZm9udCwgY29sb3IgPSAiYmxhY2siKSkgKw0KICB0aGVtZShheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArDQogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIGNvbG9yID0gImdyZXkyMCIsIHNpemUgPSAyMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSkgKw0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDExLCBjb2xvdXIgPSAiZ3JleTIwIiwgZmFjZSA9ICJpdGFsaWMiKSkgKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTApKSArDQogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEsIDEsIDIpLCAiY20iKSkgKw0KICBsYWJzKHg9IE5VTEwsIHkgPSBOVUxMLA0KICAgICAgIHRpdGxlID0gIlZpZXRuYW0gQ1BJIEluZGV4IDIwMTgiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBTb3VyY2U6IGh0dHA6Ly9wY2kyMDE4LnBjaXZpZXRuYW0udm4iKQ0KYGBgDQoNCiFbXShEOlxSXFJwbG90MDEucG5nKQ==