R Select(), Filter(), Sắp xếp(), Đường dẫn có ví dụ

Thư viện có tên dplyr chứa các động từ có giá trị để điều hướng bên trong tập dữ liệu. Thông qua hướng dẫn này, bạn sẽ sử dụng tập dữ liệu Thời gian di chuyển. Bộ dữ liệu thu thập thông tin về chuyến đi do tài xế thực hiện giữa nhà và nơi làm việc của anh ta. Có mười bốn biến trong tập dữ liệu, bao gồm:

  • DayOfWeek: Xác định ngày trong tuần tài xế sử dụng xe của mình
  • Khoảng cách: Tổng quãng đường của hành trình
  • MaxSpeed: Tốc độ tối đa của hành trình
  • TotalTime: Độ dài tính bằng phút của hành trình

Tập dữ liệu có khoảng 200 quan sát trong tập dữ liệu và các chuyến đi diễn ra giữa Monday Đến ngày thứ sáu.

Trước hết, bạn cần phải:

  • tải tập dữ liệu
  • kiểm tra cấu trúc dữ liệu.

Một tính năng tiện dụng của dplyr là hàm look(). Đây là một cải tiến so với str(). Chúng ta có thể sử dụng cái nhìn thoáng qua() để xem cấu trúc của tập dữ liệu và quyết định những thao tác nào là cần thiết.

library(dplyr) 
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv"
df <- read.csv(PATH)
glimpse(df)

Đầu ra:

## Observations: 205
## Variables: 14
## $ X              <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
## $ Date           <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20...
## $ StartTime      <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3...
## $ DayOfWeek      <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,...
## $ GoingTo        <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS...
## $ Distance       <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37...
## $ MaxSpeed       <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2...
## $ AvgSpeed       <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,...
## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,...
## $ FuelEconomy    <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89...
## $ TotalTime      <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,...
## $ MovingTime     <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,...
## $ Take407All     <fctr> No, No, No, No, No, No, No, No, No, No, No, No...
## $ Comments       <fctr> , , , , , , , , , , , , , , , Put snow tires o...	

Điều này rõ ràng là biến Comments cần được chẩn đoán thêm. Những quan sát đầu tiên của biến Comments chỉ thiếu các giá trị.

sum(df$Comments =="")

Giải thích mã

  • sum(df$Comments ==””): Tổng các quan sát bằng “” trong cột comments từ df

Đầu ra:

## [1] 181

lựa chọn()

Chúng ta sẽ bắt đầu với động từ select(). Chúng tôi không nhất thiết cần tất cả các biến và cách tốt nhất là chỉ chọn những biến bạn thấy phù hợp.

Chúng tôi có 181 quan sát bị thiếu, gần 90% tập dữ liệu. Nếu bạn quyết định loại trừ chúng, bạn sẽ không thể tiếp tục phân tích.

Khả năng khác là bỏ biến Comment bằng động từ select().

Chúng ta có thể chọn các biến theo nhiều cách khác nhau với select(). Lưu ý rằng, đối số đầu tiên là tập dữ liệu.

- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset.
- `select(df, A:C)`: Select all variables from A to C from df dataset.
- `select(df, -C)`: Exclude C from the dataset from df dataset.	

Bạn có thể sử dụng cách thứ ba để loại trừ biến Comments.

step_1_df <- select(df, -Comments)
dim(df)

Đầu ra:

## [1] 205  14
dim(step_1_df)

Đầu ra:

## [1] 205  13

Tập dữ liệu gốc có 14 tính năng trong khi step_1_df có 13 tính năng.

Lọc()

Động từ filter() giúp giữ các quan sát theo một tiêu chí. Filter() hoạt động chính xác như select(), trước tiên bạn truyền khung dữ liệu rồi đến một điều kiện được phân tách bằng dấu phẩy:

filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition:  Condition used to filter the data	

Một tiêu chí

Trước hết, bạn có thể đếm số lượng quan sát trong mỗi cấp độ của một biến nhân tố.

table(step_1_df$GoingTo)

Giải thích mã

  • table(): Đếm số lượng quan sát theo cấp độ. Lưu ý, chỉ chấp nhận biến cấp độ yếu tố
  • table(step_1_df$GoingTo): Đếm số chuyến đi tới đích cuối cùng.

Đầu ra:

## 
##  GSK Home 
##  105  100	

Bảng hàm() cho biết 105 chuyến sẽ đến GSK và 100 chuyến sẽ về Nhà.

Chúng ta có thể lọc dữ liệu để trả về một tập dữ liệu có 105 quan sát và một tập dữ liệu khác có 100 quan sát.

# Select observations
if GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

Đầu ra:

## [1] 100  14
# Select observations
if GoingTo == Work
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

Đầu ra:

## [1] 105  14

Nhiều tiêu chí

Chúng ta có thể lọc một tập dữ liệu có nhiều tiêu chí. Ví dụ: bạn có thể trích xuất các quan sát trong đó điểm đến là Nhà và diễn ra vào Thứ Tư.

select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday")
dim(select_home_wed)

Đầu ra:

## [1] 23 14

23 quan sát phù hợp với tiêu chí này.

Pipeline

Việc tạo một tập dữ liệu đòi hỏi rất nhiều thao tác, chẳng hạn như:

  • nhập khẩu
  • sáp nhập
  • lựa chọn
  • lọc
  • và vv

Thư viện dplyr đi kèm với một toán tử thực tế, %>%, được gọi là đường ống dẫn. Tính năng đường ống giúp thao tác trở nên rõ ràng, nhanh chóng và ít gây ra lỗi hơn.

Toán tử này là mã thực hiện các bước mà không lưu các bước trung gian vào ổ cứng. Nếu bạn quay lại ví dụ trên của chúng tôi, bạn có thể chọn các biến quan tâm và lọc chúng. Chúng tôi có ba bước:

  • Bước 1: Nhập dữ liệu: Nhập dữ liệu gps
  • Bước 2: Chọn dữ liệu: Chọn GoingTo và DayOfWeek
  • Bước 3: Lọc dữ liệu: Chỉ trả về Nhà và Thứ Tư

Chúng ta có thể sử dụng cách khó để làm điều đó:

# Step 1
step_1 <- read.csv(PATH)

# Step 2 
step_2 <- select(step_1, GoingTo, DayOfWeek)

# Step 3 
step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday")

head(step_3)

Đầu ra:

##   GoingTo DayOfWeek
## 1    Home Wednesday
## 2    Home Wednesday
## 3    Home Wednesday
## 4    Home Wednesday
## 5    Home Wednesday
## 6    Home Wednesday	

Đó không phải là cách thuận tiện để thực hiện nhiều thao tác, đặc biệt trong tình huống có nhiều bước. Môi trường kết thúc với rất nhiều đối tượng được lưu trữ.

Thay vào đó, hãy sử dụng toán tử đường ống %>%. Chúng ta chỉ cần xác định khung dữ liệu được sử dụng lúc đầu và tất cả quá trình sẽ diễn ra từ đó.

Cú pháp cơ bản của đường ống

New_df <- df %>%
step 1 %>%
step 2 %>%
...
arguments
- New_df: Name of the new data frame 
- df: Data frame used to compute the step
- step: Instruction for each step
- Note: The last instruction does not need the pipe operator `%`, you don't have instructions to pipe anymore
Note: Create a new variable is optional. If not included, the output will be displayed in the console.

Bạn có thể tạo đường ống đầu tiên của mình bằng cách thực hiện theo các bước được liệt kê ở trên.

# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline
filter_home_wed <- 

#Step 1
read.csv(PATH) % > % 

#Step 2
select(GoingTo, DayOfWeek) % > % 

#Step 3
filter(GoingTo == "Home",DayOfWeek == "Wednesday")
identical(step_3, filter_home_wed)

Đầu ra:

## [1] TRUE

Chúng tôi sẵn sàng tạo một tập dữ liệu tuyệt đẹp với toán tử đường ống.

sắp xếp()

Trong tạp chí hướng dẫn trước, bạn học cách sắp xếp các giá trị bằng hàm sắp xếp(). Thư viện dplyr có chức năng sắp xếp. Nó hoạt động như một sự quyến rũ với đường ống. Động từ sắp xếp() có thể sắp xếp lại một hoặc nhiều hàng, tăng dần (mặc định) hoặc giảm dần.

- `arrange(A)`: Ascending sort of variable A
- `arrange(A, B)`: Ascending sort of variable A and B
- `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B

Chúng ta có thể sắp xếp khoảng cách theo điểm đến.

# Sort by destination and distance
step_2_df <-step_1_df %>%
	arrange(GoingTo, Distance)
head<step_2_df)

Đầu ra:

##     X       Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed
## 1 193  7/25/2011     08:06    Monday     GSK    48.32    121.2     63.4
## 2 196  7/21/2011     07:59  Thursday     GSK    48.35    129.3     81.5
## 3 198  7/20/2011     08:24 Wednesday     GSK    48.50    125.8     75.7
## 4 189  7/27/2011     08:15 Wednesday     GSK    48.82    124.5     70.4
## 5  95 10/11/2011     08:25   Tuesday     GSK    48.94    130.8     85.7
## 6 171  8/10/2011     08:13 Wednesday     GSK    48.98    124.8     72.8
##   AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All
## 1           78.4        8.45      45.7       37.0         No
## 2           89.0        8.28      35.6       32.6        Yes
## 3           87.3        7.89      38.5       33.3        Yes
## 4           77.8        8.45      41.6       37.6         No
## 5           93.2        7.81      34.3       31.5        Yes
## 6           78.8        8.54      40.4       37.3         No

Tổng kết

Trong bảng bên dưới, bạn tóm tắt tất cả các thao tác bạn đã học trong phần hướng dẫn.

Động từ Mục tiêu Giải thích
nhìn thoáng qua kiểm tra cấu trúc của một df
glimpse(df)
Giống hệt str()
lựa chọn() Chọn/loại trừ các biến
select(df, A, B ,C)
Chọn các biến A, B và C
select(df, A:C)
Chọn tất cả các biến từ A đến C
select(df, -C)
Loại trừ C
bộ lọc () Lọc df dựa trên một hoặc nhiều điều kiện
filter(df, condition1)
Một điều kiện
filter(df, condition1
điều kiện2)
sắp xếp() Sắp xếp tập dữ liệu với một hoặc nhiều biến
arrange(A)
Sắp xếp tăng dần của biến A
arrange(A, B)
Sắp xếp tăng dần của biến A và B
arrange(desc(A), B)
Sắp xếp giảm dần của biến A và sắp xếp tăng dần của biến B
%>% Tạo một đường dẫn giữa mỗi bước
step 1 %>% step 2 %>% step 3