Các lệnh merge data frame

Lệnh merge() để gộp lại các dataset căn cứ theo mã ID, mình có trình bày ở phút 1:35:31 trong session 6 [K1-RPC] về các lệnh reshape, merge dữ liệu nhé.

Trong việc “gộp” dữ liệu thì ngoài lệnh merge() ta sẽ cần có các cơ chế về lệnh rbind() dùng để dán các hàng lại với nhau (khi dataset có cùng cấu trúc cột), hoặc cbind() dùng để dán các cột lại với nhau (khi dataset có cùng số lượng hàng).

Câu 1

Bạn có 2 dataset như sau: [dg1][dg2]

dg1 <- read.csv("dataset/dg1.csv")
dg1
   mpg cyl disp  hp drat
1 21.0   6  160 110 3.90
2 21.0   6  160 110 3.90
3 22.8   4  108  93 3.85
4 21.4   6  258 110 3.08
5 18.7   8  360 175 3.15
dg2 <- read.csv("dataset/dg2.csv")
dg2
   mpg cyl  disp  hp drat
1 18.1   6 225.0 105 2.76
2 14.3   8 360.0 245 3.21
3 24.4   4 146.7  62 3.69
4 22.8   4 140.8  95 3.92
5 19.2   6 167.6 123 3.92
6 17.8   6 167.6 123 3.92
7 16.4   8 275.8 180 3.07

Bạn hãy ghép lại hai dataset này theo hàng, ta có kết quả sau.

    mpg cyl  disp  hp drat
1  21.0   6 160.0 110 3.90
2  21.0   6 160.0 110 3.90
3  22.8   4 108.0  93 3.85
4  21.4   6 258.0 110 3.08
5  18.7   8 360.0 175 3.15
6  18.1   6 225.0 105 2.76
7  14.3   8 360.0 245 3.21
8  24.4   4 146.7  62 3.69
9  22.8   4 140.8  95 3.92
10 19.2   6 167.6 123 3.92
11 17.8   6 167.6 123 3.92
12 16.4   8 275.8 180 3.07
dg_all <- rbind(dg1, dg2)

dg_all
    mpg cyl  disp  hp drat
1  21.0   6 160.0 110 3.90
2  21.0   6 160.0 110 3.90
3  22.8   4 108.0  93 3.85
4  21.4   6 258.0 110 3.08
5  18.7   8 360.0 175 3.15
6  18.1   6 225.0 105 2.76
7  14.3   8 360.0 245 3.21
8  24.4   4 146.7  62 3.69
9  22.8   4 140.8  95 3.92
10 19.2   6 167.6 123 3.92
11 17.8   6 167.6 123 3.92
12 16.4   8 275.8 180 3.07

Câu 2

Bạn có 2 dataset như sau: [dg1][dg3]

dg1 <- read.csv("dataset/dg1.csv")
dg1
   mpg cyl disp  hp drat
1 21.0   6  160 110 3.90
2 21.0   6  160 110 3.90
3 22.8   4  108  93 3.85
4 21.4   6  258 110 3.08
5 18.7   8  360 175 3.15

Ta để ý thì thấy thứ tự các cột trong dg3 khác trật tự so với dg1, ta cần sắp xếp thứ tự cho cùng trật tự với nhau thì mới dán hàng lại được.

dg3 <- read.csv("dataset/dg3.csv")
dg3
   disp cyl  mpg  hp drat
1 225.0   6 18.1 105 2.76
2 360.0   8 14.3 245 3.21
3 146.7   4 24.4  62 3.69
4 140.8   4 22.8  95 3.92
5 167.6   6 19.2 123 3.92
6 167.6   6 17.8 123 3.92
7 275.8   8 16.4 180 3.07

Bạn hãy ghép lại hai dataset này theo hàng, ta có kết quả sau.

    mpg cyl  disp  hp drat
1  21.0   6 160.0 110 3.90
2  21.0   6 160.0 110 3.90
3  22.8   4 108.0  93 3.85
4  21.4   6 258.0 110 3.08
5  18.7   8 360.0 175 3.15
6  18.1   6 225.0 105 2.76
7  14.3   8 360.0 245 3.21
8  24.4   4 146.7  62 3.69
9  22.8   4 140.8  95 3.92
10 19.2   6 167.6 123 3.92
11 17.8   6 167.6 123 3.92
12 16.4   8 275.8 180 3.07

Ta kiểm tra thứ tự tên cột của hai dataset này ban đầu là khác nhau.

identical(names(dg1), names(dg3))
[1] FALSE

Ta cần sắp xếp thứ tự tên cột của dg3 theo thứ tự tên cột của dg1 để cùng 1 trật tự.

source("http://thongkevavedothi.com/code/kiem_tra_thu_tu_vector.R")
kiem_tra_thu_tu_vector(input_1 = names(dg1), 
                       input_2 = names(dg3))
[1] "Hai vector giống nhau về thành phần, nhưng khác thứ tự"

Ta dùng lệnh match() để xếp thứ tự cột trong dg3 theo dg1, đưa vào subset trong data frame để đảo lại đúng vị trí cột của dg3.

dg3 <- dg3[ ,   match(names(dg3), names(dg1) )     ]

identical(names(dg1), names(dg3))
[1] TRUE
kiem_tra_thu_tu_vector(input_1 = names(dg1), 
                       input_2 = names(dg3))
[1] "Hai vector giống y chang nhau về thành phần và thứ tự"
dg_all <- rbind(dg1, dg3)

dg_all
    mpg cyl  disp  hp drat
1  21.0   6 160.0 110 3.90
2  21.0   6 160.0 110 3.90
3  22.8   4 108.0  93 3.85
4  21.4   6 258.0 110 3.08
5  18.7   8 360.0 175 3.15
6  18.1   6 225.0 105 2.76
7  14.3   8 360.0 245 3.21
8  24.4   4 146.7  62 3.69
9  22.8   4 140.8  95 3.92
10 19.2   6 167.6 123 3.92
11 17.8   6 167.6 123 3.92
12 16.4   8 275.8 180 3.07

Lưu ý là lệnh rbind() trước phiên bản R 4.0 thì rất khắt khe trong việc dán các dataset lại với nhau, cần phải thực hiện các bước kiểm tra kỹ lưỡng vị trí cột như ở trên.

Sau phiên bản R 4.0 thì nếu 2 dataset có cùng thông tin các cột nhưng khác vị trí thì lệnh rbind() này cũng tự động chuyển giùm mình các cột về cùng thứ tự với data frame khai báo ở tham số đầu tiên. Điều này làm chúng ta tưởng là các data frame đã đồng nhất về thứ tự cột, do đó ta cần kiểm tra thủ công cho chắc ăn như cách làm ở trên.