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] và [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] và [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))
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))
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.