Kỹ thuật merge dữ liệu trong R

Author

Duc Nguyen | Founder of tuhocr.com

Published

Cập nhật: 2024 June 06

Dataset df_1

df_1 <- readxl::read_excel("df_1.xlsx")
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

df_2 <- readxl::read_excel("df_2.xlsx")
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

df_3 <- readxl::read_excel("df_3.xlsx")
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_1df_2 \(\Rightarrow\) Áp dụng cách tiếp cận gom cột countryyear thành 1 cột để làm ID, sau đó merge theo all = TRUE

df_1$country_year <- paste0(df_1$country, "-", df_1$year)

identical(dim(df_1)[1], length(unique(df_1$country_year)))
[1] TRUE
df_2$country_year <- paste0(df_2$country, "-", df_2$year)

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_2df_3.

df_3$country_year <- paste0(df_3$country, "-", df_3$year)

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_clean <- df_1_2_3[ , c("country_year", "var_1", "var_2", "var_3", "var_4", "var_5")]

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.

df_1_2_3_clean$country <- ok_1[, 1]

df_1_2_3_clean$year <- ok_1[, 2]

df_1_2_3_final <- 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
   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

  1. https://www.infoworld.com/article/3454356/how-to-merge-data-in-r-using-r-merge-dplyr-or-datatable.html