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
!