Sử dụng hàm select trong dplyr

Tác giả: Nguyễn Hải Trường | 2019-02-05

Select thông thường

Như các bạn đã biết để lấy dữ liệu theo biến (cột), thông thường chúng ta sẽ sử dụng hàm select() với cấu trúc như sau select(tên biến) hoặc select(số thứ tự của biến).

Ví dụ sử dụng dữ liệu iris có sẵn trong R

library(dplyr) # package sử dụng

# Các biến có trong data iris
iris %>% names
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
## [5] "Species"

Dữ liệu này có 5 biến với thứ tự lần lượt như trên.

# Lấy 2 biến Sepal.Length và Sepal.Width
iris %>% 
  select(Sepal.Length, Sepal.Width) %>% 
  head
##   Sepal.Length Sepal.Width
## 1          5.1         3.5
## 2          4.9         3.0
## 3          4.7         3.2
## 4          4.6         3.1
## 5          5.0         3.6
## 6          5.4         3.9
# Lấy biến thứ 2 và thứ 4 của dữ liệu
iris %>% 
  select(2,4) %>% 
  head
##   Sepal.Width Petal.Width
## 1         3.5         0.2
## 2         3.0         0.2
## 3         3.2         0.2
## 4         3.1         0.2
## 5         3.6         0.2
## 6         3.9         0.4

Trong trường hợp này, dữ liệu của chúng ta chỉ có 5 biến (cột), do vậy để lấy dữ liệu theo biến, chúng ta có thể dùng hàm select liệt kê những biến mà chúng ta muốn lấy một cách manual.

Còn trong trường hợp dữ liệu của chúng ta có nhiều biến, và có những biến mà tên có những ký tự giống nhau thì việc dùng hàm select một cách manual như trên sẽ rất mất nhiều thời gian và công sức. Trong trường hợp này, chúng ta nên sử dụng hàm select kết hợp với một số hàm như: contains(), starts_with(), ends_with(), match().

select + contains

Sử dụng dữ liệu flights trong package nycflights13. Dữ liệu bao gồm các chuyến bay khởi hành từ New York City trong năm 2013.

library(nycflights13)
data("flights")

# Tên các biến trong dữ liệu
flights %>% names
##  [1] "year"           "month"          "day"            "dep_time"      
##  [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"
##  [9] "arr_delay"      "carrier"        "flight"         "tailnum"       
## [13] "origin"         "dest"           "air_time"       "distance"      
## [17] "hour"           "minute"         "time_hour"
# 6 quan sát đầu tiên
library(knitr)
flights %>% 
  head %>% 
  kable()
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance hour minute time_hour
2013 1 1 517 515 2 830 819 11 UA 1545 N14228 EWR IAH 227 1400 5 15 2013-01-01 05:00:00
2013 1 1 533 529 4 850 830 20 UA 1714 N24211 LGA IAH 227 1416 5 29 2013-01-01 05:00:00
2013 1 1 542 540 2 923 850 33 AA 1141 N619AA JFK MIA 160 1089 5 40 2013-01-01 05:00:00
2013 1 1 544 545 -1 1004 1022 -18 B6 725 N804JB JFK BQN 183 1576 5 45 2013-01-01 05:00:00
2013 1 1 554 600 -6 812 837 -25 DL 461 N668DN LGA ATL 116 762 6 0 2013-01-01 06:00:00
2013 1 1 554 558 -4 740 728 12 UA 1696 N39463 EWR ORD 150 719 5 58 2013-01-01 05:00:00

Hàm select(contains("text")) giúp chúng ta lấy các biến mà tên có chứa ký tự/cụm từ nhất định.

Giả sử chúng ta muốn lấy các biến liên quan đến thời gian khởi hành (departure) -> dùng câu lệnh sau:

flights %>% 
  # Lấy các biến mà tên có chứa từ `dep`
  select(contains("dep")) %>% 
  head %>% 
  kable
dep_time sched_dep_time dep_delay
517 515 2
533 529 4
542 540 2
544 545 -1
554 600 -6
554 558 -4

select + starts_with

Hàm select(starts_with("text")) giúp chúng ta lấy các biến mà tên bắt đầu với ký tự/cụm từ nhất định.

Trong trường hợp chúng ta muốn lấy biến thời gian hạ cánh thực tế và thời gian chênh lệch giữa thời gian hạ cánh thực tế so với dự kiến -> dùng câu lệnh sau:

flights %>% 
  # Lấy các biến mà tên bắt đầu với từ `arr`
  select(starts_with("arr")) %>% 
  head %>% 
  kable
arr_time arr_delay
830 11
850 20
923 33
1004 -18
812 -25
740 12

select + ends_with

Hàm select(end_with("text")) giúp chúng ta lấy các biến mà tên kết thúc với ký tự/cụm từ nhất định.

Trong trường hợp chúng ta muốn lấy các biến liên quan đến thời gian chênh lệch giữa thời gian khởi hành và hạ cánh thực tế so với dự kiến, chúng ta sử dụng câu lệnh sau:

flights %>% 
  # Lấy các biến mà tên kết thúc với từ `arr`
  select(ends_with("delay")) %>% 
  head %>% 
  kable
dep_delay arr_delay
2 11
4 20
2 33
-1 -18
-6 -25
-4 12

select + match

Giả sử chúng ta có 2 tập dữ liệu như sau

# data1 bao gồm 6 biến đầu tiên của dữ liệu `flights`
data1 <- flights %>% select(1:6)
data1 %>% names
## [1] "year"           "month"          "day"            "dep_time"      
## [5] "sched_dep_time" "dep_delay"
# data2 bao gồm 8 biến đầu tiên của dữ liệu `flights`
data2 <- flights %>% select(1:8)
data2 %>% names
## [1] "year"           "month"          "day"            "dep_time"      
## [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"

Dữ liệu data1 là tập con của data2 (data2 có thêm 2 biến từ data1).

Giả sử đối với data2 chúng ta chỉ muốn lấy ra những biến mà có trong data1, chúng ta sử dụng câu lệnh sau:

data2 %>% 
  select(match(names(data1),   # tên các biến trong data1
               names(data2)    # tên các biến trong data2
               )) %>% 
  head %>% 
  kable
year month day dep_time sched_dep_time dep_delay
2013 1 1 517 515 2
2013 1 1 533 529 4
2013 1 1 542 540 2
2013 1 1 544 545 -1
2013 1 1 554 600 -6
2013 1 1 554 558 -4

Như vậy, chúng ta đã vừa được học cách chọn biến đối với trường hợp dữ liệu bao gồm rất nhiều biến thông qua việc sử dụng hàm select() kết hợp contains(), starts_with(), ends_with(), match(). 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