Tổ chức dữ liệu với spread và gather trong tidyverse

Tác giả: Nguyen Hai Truong | 2019-05-15

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, Ranalytics 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()spread() trong package tidyverse.

gather

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 20172018 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 20172018 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 tidyverse như sau:

library(tidyverse)
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:


spread

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, chúng ta đã vừa được học 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()spread() trong package tidyverse. Chúc các bạn học tập và làm việc hiệu quả với Ranalytics.vn!

comments powered by Disqus