Kỹ thuật merge dữ liệu trong R
Dataset df_1
<- readxl::read_excel("df_1.xlsx")
df_1 df_1
# A tibble: 20 × 5
country year var_1 var_2 var_3
<chr> <dbl> <dbl> <dbl> <dbl>
1 vn 2012 537 NA 734
2 vn 2016 21 166 711
3 vn 2017 594 900 349
4 vn 2018 NA 93 795
5 vn 2019 52 590 192
6 vn 2020 111 NA 629
7 vn 2022 332 891 981
8 vn 2024 822 351 845
9 vn 2025 359 835 530
10 us 2012 572 33 787
11 us 2013 590 356 646
12 us 2014 398 964 118
13 us 2015 962 895 857
14 us 2016 22 NA 37
15 us 2017 401 NA 748
16 us 2018 294 630 213
17 us 2019 854 462 386
18 us 2020 95 743 431
19 us 2021 111 374 367
20 us 2022 272 507 393
Dataset df_2
<- readxl::read_excel("df_2.xlsx")
df_2 df_2
# A tibble: 20 × 3
country year var_4
<chr> <dbl> <dbl>
1 vn 2012 187
2 vn 2016 988
3 vn 2017 822
4 vn 2018 NA
5 vn 2019 164
6 vn 2020 143
7 vn 2022 105
8 vn 2024 347
9 vn 2025 134
10 en 2010 750
11 en 2011 776
12 en 2012 357
13 en 2013 NA
14 en 2014 260
15 en 2015 357
16 en 2016 28
17 en 2017 761
18 en 2018 804
19 en 2019 957
20 en 2020 NA
Dataset df_3
<- readxl::read_excel("df_3.xlsx")
df_3 df_3
# A tibble: 18 × 3
country year var_5
<chr> <dbl> <dbl>
1 us 2012 620
2 us 2016 129
3 us 2017 902
4 us 2018 NA
5 us 2019 176
6 us 2020 796
7 us 2022 582
8 us 2024 406
9 us 2025 620
10 en 2010 74
11 en 2011 763
12 en 2012 256
13 en 2013 NA
14 en 2014 557
15 en 2015 76
16 en 2016 373
17 en 2017 818
18 en 2018 234
Merge lần 1 giữa df_1
và df_2
country
và year
thành 1 cột để làm ID
, sau đó merge theo all = TRUE
$country_year <- paste0(df_1$country, "-", df_1$year)
df_1
identical(dim(df_1)[1], length(unique(df_1$country_year)))
[1] TRUE
$country_year <- paste0(df_2$country, "-", df_2$year)
df_2
identical(dim(df_2)[1], length(unique(df_2$country_year)))
[1] TRUE
merge(x = df_1,
y = df_2,
by = "country_year",
all = TRUE) -> df_1_2
df_1_2
country_year country.x year.x var_1 var_2 var_3 country.y year.y var_4
1 en-2010 <NA> NA NA NA NA en 2010 750
2 en-2011 <NA> NA NA NA NA en 2011 776
3 en-2012 <NA> NA NA NA NA en 2012 357
4 en-2013 <NA> NA NA NA NA en 2013 NA
5 en-2014 <NA> NA NA NA NA en 2014 260
6 en-2015 <NA> NA NA NA NA en 2015 357
7 en-2016 <NA> NA NA NA NA en 2016 28
8 en-2017 <NA> NA NA NA NA en 2017 761
9 en-2018 <NA> NA NA NA NA en 2018 804
10 en-2019 <NA> NA NA NA NA en 2019 957
11 en-2020 <NA> NA NA NA NA en 2020 NA
12 us-2012 us 2012 572 33 787 <NA> NA NA
13 us-2013 us 2013 590 356 646 <NA> NA NA
14 us-2014 us 2014 398 964 118 <NA> NA NA
15 us-2015 us 2015 962 895 857 <NA> NA NA
16 us-2016 us 2016 22 NA 37 <NA> NA NA
17 us-2017 us 2017 401 NA 748 <NA> NA NA
18 us-2018 us 2018 294 630 213 <NA> NA NA
19 us-2019 us 2019 854 462 386 <NA> NA NA
20 us-2020 us 2020 95 743 431 <NA> NA NA
21 us-2021 us 2021 111 374 367 <NA> NA NA
22 us-2022 us 2022 272 507 393 <NA> NA NA
23 vn-2012 vn 2012 537 NA 734 vn 2012 187
24 vn-2016 vn 2016 21 166 711 vn 2016 988
25 vn-2017 vn 2017 594 900 349 vn 2017 822
26 vn-2018 vn 2018 NA 93 795 vn 2018 NA
27 vn-2019 vn 2019 52 590 192 vn 2019 164
28 vn-2020 vn 2020 111 NA 629 vn 2020 143
29 vn-2022 vn 2022 332 891 981 vn 2022 105
30 vn-2024 vn 2024 822 351 845 vn 2024 347
31 vn-2025 vn 2025 359 835 530 vn 2025 134
Tương tự như trên, merge lần 2 giữa df_1_2
và df_3
.
$country_year <- paste0(df_3$country, "-", df_3$year)
df_3
identical(dim(df_3)[1], length(unique(df_3$country_year)))
[1] TRUE
merge(x = df_1_2,
y = df_3,
by = "country_year",
all = TRUE) -> df_1_2_3
df_1_2_3
country_year country.x year.x var_1 var_2 var_3 country.y year.y var_4 country year var_5
1 en-2010 <NA> NA NA NA NA en 2010 750 en 2010 74
2 en-2011 <NA> NA NA NA NA en 2011 776 en 2011 763
3 en-2012 <NA> NA NA NA NA en 2012 357 en 2012 256
4 en-2013 <NA> NA NA NA NA en 2013 NA en 2013 NA
5 en-2014 <NA> NA NA NA NA en 2014 260 en 2014 557
6 en-2015 <NA> NA NA NA NA en 2015 357 en 2015 76
7 en-2016 <NA> NA NA NA NA en 2016 28 en 2016 373
8 en-2017 <NA> NA NA NA NA en 2017 761 en 2017 818
9 en-2018 <NA> NA NA NA NA en 2018 804 en 2018 234
10 en-2019 <NA> NA NA NA NA en 2019 957 <NA> NA NA
11 en-2020 <NA> NA NA NA NA en 2020 NA <NA> NA NA
12 us-2012 us 2012 572 33 787 <NA> NA NA us 2012 620
13 us-2013 us 2013 590 356 646 <NA> NA NA <NA> NA NA
14 us-2014 us 2014 398 964 118 <NA> NA NA <NA> NA NA
15 us-2015 us 2015 962 895 857 <NA> NA NA <NA> NA NA
16 us-2016 us 2016 22 NA 37 <NA> NA NA us 2016 129
17 us-2017 us 2017 401 NA 748 <NA> NA NA us 2017 902
18 us-2018 us 2018 294 630 213 <NA> NA NA us 2018 NA
19 us-2019 us 2019 854 462 386 <NA> NA NA us 2019 176
20 us-2020 us 2020 95 743 431 <NA> NA NA us 2020 796
21 us-2021 us 2021 111 374 367 <NA> NA NA <NA> NA NA
22 us-2022 us 2022 272 507 393 <NA> NA NA us 2022 582
23 us-2024 <NA> NA NA NA NA <NA> NA NA us 2024 406
24 us-2025 <NA> NA NA NA NA <NA> NA NA us 2025 620
25 vn-2012 vn 2012 537 NA 734 vn 2012 187 <NA> NA NA
26 vn-2016 vn 2016 21 166 711 vn 2016 988 <NA> NA NA
27 vn-2017 vn 2017 594 900 349 vn 2017 822 <NA> NA NA
28 vn-2018 vn 2018 NA 93 795 vn 2018 NA <NA> NA NA
29 vn-2019 vn 2019 52 590 192 vn 2019 164 <NA> NA NA
30 vn-2020 vn 2020 111 NA 629 vn 2020 143 <NA> NA NA
31 vn-2022 vn 2022 332 891 981 vn 2022 105 <NA> NA NA
32 vn-2024 vn 2024 822 351 845 vn 2024 347 <NA> NA NA
33 vn-2025 vn 2025 359 835 530 vn 2025 134 <NA> NA NA
Loại bỏ các cột trùng, tạo ra df_1_2_3_clean
.
<- df_1_2_3[ , c("country_year", "var_1", "var_2", "var_3", "var_4", "var_5")]
df_1_2_3_clean
df_1_2_3_clean
country_year var_1 var_2 var_3 var_4 var_5
1 en-2010 NA NA NA 750 74
2 en-2011 NA NA NA 776 763
3 en-2012 NA NA NA 357 256
4 en-2013 NA NA NA NA NA
5 en-2014 NA NA NA 260 557
6 en-2015 NA NA NA 357 76
7 en-2016 NA NA NA 28 373
8 en-2017 NA NA NA 761 818
9 en-2018 NA NA NA 804 234
10 en-2019 NA NA NA 957 NA
11 en-2020 NA NA NA NA NA
12 us-2012 572 33 787 NA 620
13 us-2013 590 356 646 NA NA
14 us-2014 398 964 118 NA NA
15 us-2015 962 895 857 NA NA
16 us-2016 22 NA 37 NA 129
17 us-2017 401 NA 748 NA 902
18 us-2018 294 630 213 NA NA
19 us-2019 854 462 386 NA 176
20 us-2020 95 743 431 NA 796
21 us-2021 111 374 367 NA NA
22 us-2022 272 507 393 NA 582
23 us-2024 NA NA NA NA 406
24 us-2025 NA NA NA NA 620
25 vn-2012 537 NA 734 187 NA
26 vn-2016 21 166 711 988 NA
27 vn-2017 594 900 349 822 NA
28 vn-2018 NA 93 795 NA NA
29 vn-2019 52 590 192 164 NA
30 vn-2020 111 NA 629 143 NA
31 vn-2022 332 891 981 105 NA
32 vn-2024 822 351 845 347 NA
33 vn-2025 359 835 530 134 NA
### tách country-year
strsplit(df_1_2_3_clean$country_year, split = "-") -> ok
do.call(rbind, ok) -> ok_1
ok_1
[,1] [,2]
[1,] "en" "2010"
[2,] "en" "2011"
[3,] "en" "2012"
[4,] "en" "2013"
[5,] "en" "2014"
[6,] "en" "2015"
[7,] "en" "2016"
[8,] "en" "2017"
[9,] "en" "2018"
[10,] "en" "2019"
[11,] "en" "2020"
[12,] "us" "2012"
[13,] "us" "2013"
[14,] "us" "2014"
[15,] "us" "2015"
[16,] "us" "2016"
[17,] "us" "2017"
[18,] "us" "2018"
[19,] "us" "2019"
[20,] "us" "2020"
[21,] "us" "2021"
[22,] "us" "2022"
[23,] "us" "2024"
[24,] "us" "2025"
[25,] "vn" "2012"
[26,] "vn" "2016"
[27,] "vn" "2017"
[28,] "vn" "2018"
[29,] "vn" "2019"
[30,] "vn" "2020"
[31,] "vn" "2022"
[32,] "vn" "2024"
[33,] "vn" "2025"
Thu được df_1_2_3_final
dùng để đưa vào phân tích dữ liệu và làm sạch NA
giai đoạn sau.
$country <- ok_1[, 1]
df_1_2_3_clean
$year <- ok_1[, 2]
df_1_2_3_clean
<- df_1_2_3_clean[ , c("country_year", "country", "year", "var_1", "var_2", "var_3", "var_4", "var_5")]
df_1_2_3_final
df_1_2_3_final
country_year country year var_1 var_2 var_3 var_4 var_5
1 en-2010 en 2010 NA NA NA 750 74
2 en-2011 en 2011 NA NA NA 776 763
3 en-2012 en 2012 NA NA NA 357 256
4 en-2013 en 2013 NA NA NA NA NA
5 en-2014 en 2014 NA NA NA 260 557
6 en-2015 en 2015 NA NA NA 357 76
7 en-2016 en 2016 NA NA NA 28 373
8 en-2017 en 2017 NA NA NA 761 818
9 en-2018 en 2018 NA NA NA 804 234
10 en-2019 en 2019 NA NA NA 957 NA
11 en-2020 en 2020 NA NA NA NA NA
12 us-2012 us 2012 572 33 787 NA 620
13 us-2013 us 2013 590 356 646 NA NA
14 us-2014 us 2014 398 964 118 NA NA
15 us-2015 us 2015 962 895 857 NA NA
16 us-2016 us 2016 22 NA 37 NA 129
17 us-2017 us 2017 401 NA 748 NA 902
18 us-2018 us 2018 294 630 213 NA NA
19 us-2019 us 2019 854 462 386 NA 176
20 us-2020 us 2020 95 743 431 NA 796
21 us-2021 us 2021 111 374 367 NA NA
22 us-2022 us 2022 272 507 393 NA 582
23 us-2024 us 2024 NA NA NA NA 406
24 us-2025 us 2025 NA NA NA NA 620
25 vn-2012 vn 2012 537 NA 734 187 NA
26 vn-2016 vn 2016 21 166 711 988 NA
27 vn-2017 vn 2017 594 900 349 822 NA
28 vn-2018 vn 2018 NA 93 795 NA NA
29 vn-2019 vn 2019 52 590 192 164 NA
30 vn-2020 vn 2020 111 NA 629 143 NA
31 vn-2022 vn 2022 332 891 981 105 NA
32 vn-2024 vn 2024 822 351 845 347 NA
33 vn-2025 vn 2025 359 835 530 134 NA
Tài liệu tham khảo
https://www.infoworld.com/article/3454356/how-to-merge-data-in-r-using-r-merge-dplyr-or-datatable.html