Trong quá trình phân tích dữ liệu, sẽ có lúc chúng ta muốn nhìn dữ
liệu theo các chiều khác nhau. Trong bài viết này, mình sẽ hướng dẫn các
bạn cách tổ chức dữ liệu theo cách mà chúng ta mong muốn bằng việc sử
dụng hàm gather() và spread() trong package
tidyr.
Sử dụng dữ liệu giả định, bao gồm tổng điểm thi cuối năm 5 môn: Toán, Lý, Hóa, Anh, Văn của 3 bạn học sinh cấp 3 vào năm 2017, 2018.
library(tibble)
table1 <- tibble(
student = c("Viet", "Nam", "Quoc"),
`2017` = c(37.5, 40, 45),
`2018` = c(40, 40, 42.5)
)
table1## # A tibble: 3 x 3
## student `2017` `2018`
## <chr> <dbl> <dbl>
## 1 Viet 37.5 40
## 2 Nam 40 40
## 3 Quoc 45 42.5
Giả sử bây giờ chúng ta muốn tổ chức dữ liệu theo một cách khác.
Chúng ta sẽ nhóm 2 biến 2017 và 2018 thành
giá trị của biến mới, sẽ đặt tên là year, còn biến chứa
những giá trị của biến 2017 và 2018 lúc đầu sẽ
được đặt tên là total_score (tổng điểm)
Chúng ta sẽ sử dụng hàm gather() trong package
tidyr như sau:
library(tidyr)
table2 <- table1 %>%
gather(
`2017`, `2018`, # 2 biến cần nhóm lại (gather)
key = "year", # Biến mới `year` bao gồm 2 giá trị 2017,2018
value = "total_score" # Biến mới `total_score` chứa giá trị của 2 biến `2017` và `2018` ban đầu
)
table2## # A tibble: 6 x 3
## student year total_score
## <chr> <chr> <dbl>
## 1 Viet 2017 37.5
## 2 Nam 2017 40
## 3 Quoc 2017 45
## 4 Viet 2018 40
## 5 Nam 2018 40
## 6 Quoc 2018 42.5
Quá trình biến đổi dữ liệu vừa rồi được mô tả bằng hình ảnh sau:
Spreading là quá trình ngược lại của gathering.
Cấu trúc hàm spread() như sau:
table2 %>%
spread(
key = year, # spread biến year (các giá trị trong biến year thành các biến mới)
value = total_score
)## # A tibble: 3 x 3
## student `2017` `2018`
## <chr> <dbl> <dbl>
## 1 Nam 40 40
## 2 Quoc 45 42.5
## 3 Viet 37.5 40
Như vậy, mình vừa chia sẻ với các bạn cách tổ chức dữ liệu theo cách
mà chúng ta mong muốn bằng việc sử dụng hàm gather() và
spread() trong package tidyr.
Chúc các bạn học tập và làm việc hiệu quả!