Bộ dữ liệu VHLSS và GADM Data có sự lệch nhau tương đối về tên của đơn vị hành chính cấp huyện. Chưa kể trong thời gian qua thì có sự chia tách - tái lập - sát nhập để tạo ra các đơn vị hành chính mới ở Việt Nam trong khi GADM Data chưa cập nhật kịp.
Dưới đây là R codes để xử lí - cập nhật - hợp nhất các bộ data khác nhau. Mấu chốt ở đây là sử dụng danh sách đơn vị hành chính cấp huyện của GSO làm key để join VHLSS và GADM Data:
# Clear R Evironment:
rm(list = ls())
# Load GADM data for Vietnam by Distric level:
vn_district <- raster::getData("GADM", country = "Vietnam", level = 2)
# Convert to DF:
library(tidyverse)
vn_district %>% fortify(region = "NAME_2") -> df_district
# Convert to Latin names:
library(stringi)
library(stringr)
df_district %>%
mutate(id_latin = stri_trans_general(id, "Latin-ASCII")) %>%
mutate(id_latin = str_squish(id_latin)) -> df_district
df_district %>%
mutate(id_latin = case_when(str_detect(id_latin, "Thi xa") ~ str_c("Thi xa", str_replace_all(id_latin, "\\(Thi xa\\)", ""), sep = " "),
TRUE ~ id_latin)) %>%
mutate(id_latin = str_squish(id_latin)) -> df_district
# Load VHLS data (from https://www.mediafire.com/file/b6hm4zngz2q5tc6/VHLSS_2020.zip/file):
haven::read_dta("E:/VHLSS 2020/VHLSS2020_Household_Data/HO3.dta") -> ho3
# Function creates full code by adding zeros:
add_zero <- function(x) {
tibble(x_text = as.character(x)) %>%
mutate(n_digits = str_count(x_text),
n_max = max(n_digits),
delta = n_max - n_digits,
pre = strrep("0", times = delta),
full_code = str_c(pre, x_text)) %>%
pull(full_code) %>%
return()
}
ho3 %>% mutate(d_code = add_zero(huyen)) -> ho3
# Load district codes from https://www.gso.gov.vn/phuong-phap-luan-thong-ke/danh-muc/don-vi-hanh-chinh/:
readxl::read_excel("C:/Users/Admin/Documents/Danh sách cấp huyện __28_07_2022.xls") -> district_codes
# Rename for all columns:
names(district_codes) <- c("d_code", "vn_name", "eng_name", "level", "province_code", "province_name")
# Remove missing:
district_codes %>% filter(!is.na(d_code)) -> district_codes
# Convert to Latin name:
district_codes %>%
mutate(id_latin = stri_trans_general(vn_name, "Latin-ASCII")) %>%
mutate(id_latin = str_replace_all(id_latin, "Huyen|Thanh pho", "")) %>%
mutate(id_latin = str_squish(id_latin)) -> district_codes
# Check differences:
df_district$id_latin %>% unique() -> districts_from_GADM
district_codes$id_latin %>% unique() -> districts_from_GSO
setdiff(districts_from_GADM, districts_from_GSO) -> sai_khac
# Reason:
k <- length(sai_khac)
j <- 17
sai_khac[j]## [1] "Cua Lo"
districts_from_GADM[str_detect(districts_from_GADM, sai_khac[j])]## [1] "Cua Lo"
districts_from_GSO[str_detect(districts_from_GSO, sai_khac[j])]## [1] "Thi xa Cua Lo"
# Adjust/harmonize name differences:
df_district %>%
mutate(id_latin_adjusted = case_when(id_latin == sai_khac[1] ~ "Thi xa An Khe",
id_latin == sai_khac[2] ~ "Thi xa An Nhon",
id_latin == sai_khac[3] ~ "Thi xa Ayun Pa",
id_latin == sai_khac[4] ~ "Quan Ba Dinh",
id_latin == sai_khac[5] ~ "Thi xa Ba Don",
id_latin == sai_khac[6] ~ "Quan Bac Tu Liem",
id_latin == sai_khac[7] ~ "Thi xa Ben Cat",
id_latin == sai_khac[8] ~ "Thi xa Bim Son",
id_latin == sai_khac[9] ~ "Thi xa Binh Long",
id_latin == sai_khac[10] ~ "Thi xa Binh Minh",
id_latin == sai_khac[11] ~ "Quan Binh Thanh",
id_latin == sai_khac[12] ~ "Quan Binh Thuy",
id_latin == sai_khac[13] ~ "Quan Cai Rang",
id_latin == sai_khac[14] ~ "Quan Cam Le",
id_latin == "Cao Lanh (Thanh pho)" ~ "Cao Lanh",
id_latin == sai_khac[16] ~ "Quan Cau Giay",
id_latin == sai_khac[17] ~ "Thi xa Cua Lo",
id_latin == sai_khac[18] ~ "Thi xa Dien Ban",
id_latin == sai_khac[19] ~ "Quan Do Son",
id_latin == sai_khac[20] ~ "Quan Dong Da",
id_latin == sai_khac[21] ~ "Thi xa Dong Hoa",
id_latin == sai_khac[22] ~ "Thi xa Dong Trieu",
id_latin == sai_khac[23] ~ "Thi xa Duc Pho",
id_latin == sai_khac[24] ~ "Quan Duong Kinh",
id_latin == sai_khac[25] ~ "Thi xa Duy Tien",
id_latin == sai_khac[26] ~ "Thi xa Gia Rai",
id_latin == sai_khac[27] ~ "Thi xa Go Cong",
id_latin == sai_khac[28] ~ "Quan Go Vap",
id_latin == sai_khac[29] ~ "Quan Ha Dong",
id_latin == sai_khac[30] ~ "Quan Hai An",
id_latin == sai_khac[31] ~ "Quan Hai Ba Trung",
id_latin == sai_khac[32] ~ "Quan Hai Chau",
id_latin == sai_khac[33] ~ "Thi xa Hoa Thanh",
id_latin == sai_khac[34] ~ "Thi xa Hoai Nhon",
id_latin == sai_khac[35] ~ "Quan Hoan Kiem",
id_latin == sai_khac[36] ~ "Quan Hoang Mai",
id_latin == sai_khac[37] ~ "Ha Long", # https://vi.wikipedia.org/wiki/Ho%C3%A0nh_B%E1%BB%93_(huy%E1%BB%87n)
id_latin == sai_khac[38] ~ "Quan Hong Bang",
id_latin == sai_khac[39] ~ "Thi xa Hong Linh",
id_latin == sai_khac[40] ~ "Hong Ngu",
id_latin == sai_khac[41] ~ "Thi xa Huong Thuy",
id_latin == sai_khac[42] ~ "Thi xa Huong Tra",
id_latin == sai_khac[43] ~ "Quan Kien An",
id_latin == sai_khac[44] ~ "Thi xa Kien Tuong",
id_latin == sai_khac[45] ~ "Thi xa Kinh Mon",
id_latin == sai_khac[46] ~ "Thi xa La Gi",
id_latin == sai_khac[47] ~ "Quan Le Chan",
id_latin == sai_khac[48] ~ "Quan Lien Chieu",
id_latin == sai_khac[49] ~ "Quan Long Bien",
id_latin == sai_khac[50] ~ "Thi xa My Hao",
id_latin == sai_khac[51] ~ "Quan Nam Tu Liem",
id_latin == sai_khac[52] ~ "Thi xa Nga Nam",
id_latin == sai_khac[53] ~ "Thi xa Nghia Lo",
id_latin == sai_khac[54] ~ "Quan Ngo Quyen",
id_latin == sai_khac[55] ~ "Quan Ngu Hanh Son",
id_latin == sai_khac[56] ~ "Thi xa Ninh Hoa",
id_latin == sai_khac[57] ~ "Quan Ninh Kieu",
id_latin == sai_khac[58] ~ "Quan O Mon",
id_latin == sai_khac[59] ~ "Quan Phu Nhuan",
id_latin == sai_khac[60] ~ "Thi xa Phu Tho",
id_latin == sai_khac[61] ~ "Quang Hoa", # https://www.duhoctrungquoc.vn/wiki/vi/Ph%E1%BB%A5c_H%C3%B2a
id_latin == sai_khac[62] ~ "Thu Duc", # https://redhub.vn/thong-tin-du-an/thanh-pho-thu-duc/
id_latin == sai_khac[63] ~ "Thu Duc",
id_latin == sai_khac[64] ~ "Thi xa Quang Tri",
id_latin == sai_khac[65] ~ "Quang Hoa",
id_latin == sai_khac[66] ~ "Thi xa Quang Yen",
id_latin == sai_khac[67] ~ "Quy Nhon",
id_latin == sai_khac[68] ~ "Thi xa Sa Pa",
id_latin == sai_khac[69] ~ "Quan Son Tra",
id_latin == sai_khac[70] ~ "Thi xa Song Cau",
id_latin == sai_khac[71] ~ "Quan Tan Binh",
id_latin == "Tay Ho" ~ "Quan Tay Ho",
id_latin == sai_khac[73] ~ "Tra Bong", # https://baodantoc.vn/tay-tra-ngon-ngang-kho-khan-sau-ngay-sap-nhap-1617245126625.htm
id_latin == sai_khac[74] ~ "Thi xa Thai Hoa",
id_latin == sai_khac[75] ~ "Quan Thanh Khe",
id_latin == sai_khac[76] ~ "Quan Thanh Xuan",
id_latin == sai_khac[77] ~ "Ha Quang", # https://vi.wikipedia.org/wiki/Th%C3%B4ng_N%C3%B4ng_(huy%E1%BB%87n)
id_latin == sai_khac[78] ~ "Quan Thot Not",
id_latin == sai_khac[79] ~ "Thi xa Nghi Son", # https://vi.wikipedia.org/wiki/T%C4%A9nh_Gia
id_latin == sai_khac[80] ~ "Quang Hoa",
id_latin == sai_khac[81] ~ "Thi xa Trang Bang",
id_latin == sai_khac[82] ~ "Thi xa Vinh Chau",
TRUE ~ id_latin)) -> df_district
# Check again:
df_district$id_latin_adjusted %>% unique() -> districts_from_GADM_adj
setdiff(districts_from_GADM_adj, districts_from_GSO)## character(0)
# Join GSO data sets:
full_join(ho3, district_codes, by = "d_code") -> ho3
# Calculate total thunhap by district level:
ho3 %>%
group_by(id_latin) %>%
summarise(total_income = sum(thunhap, na.rm = TRUE) / 1000000) %>%
ungroup() -> df_thunhap
# Join again:
full_join(df_district, df_thunhap, by = c("id_latin_adjusted" = "id_latin")) -> data_for_mapping
# Draft of map:
data_for_mapping %>%
ggplot(aes(long, lat, group = group, fill = total_income)) +
geom_polygon(color = "white", size = 0.1) +
theme_minimal() +
theme(legend.position = c(0.25, 0.45))