R Select()、Filter()、Arrange()、Pipeline 及示例

名为 dplyr 的库包含有价值的动词,可用于在数据集内导航。通过本教程,您将使用旅行时间数据集。该数据集收集了司机从家到工作地点的行程信息。数据集中有十四个变量,包括:

  • DayOfWeek:确定司机使用汽车的星期几
  • 距离:旅程总距离
  • MaxSpeed:行程的最大速度
  • 总时间:旅程的长度(分钟)

该数据集包含大约 200 个观测值,骑行发生在 Monday 到星期五。

首先,您需要:

  • 加载数据集
  • 检查数据的结构。

dplyr 的一个方便的功能是 glimpse() 函数。这是对 str() 的改进。我们可以使用 glimpse() 查看数据集的结构并决定需要进行哪些操作。

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

输出:

## 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...	

显然,变量 Comments 需要进一步诊断。Comments 变量的第一次观察结果只有缺失值。

sum(df$Comments =="")

代码说明

  • sum(df$Comments ==””):对 df 中列注释中等于“”的观察值求和

输出:

## [1] 181

选择()

我们将从 select() 动词开始。我们不一定需要所有变量,一个好的做法是只选择您认为相关的变量。

我们有 181 个缺失的观测值,几乎占数据集的 90%。如果您决定排除它们,您将无法继续分析。

另一种可能性是使用 select() 动词删除变量 Comment。

我们可以使用 select() 以不同的方式选择变量。请注意,第一个参数是数据集。

- `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.	

您可以使用第三种方法来排除 Comments 变量。

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

输出:

## [1] 205  14
dim(step_1_df)

输出:

## [1] 205  13

原始数据集有 14 个特征,而 step_1_df 有 13 个。

筛选()

filter() 动词有助于使观察结果符合标准。filter() 的工作原理与 select() 完全相同,您首先传递数据框,然后传递用逗号分隔的条件:

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

一个标准

首先,您可以计算因子变量每个级别内的观测值数量。

table(step_1_df$GoingTo)

代码说明

  • table():按级别统计观察值的数量。注意,只接受因子级别变量
  • table(step_1_df$GoingTo):计算到达最终目的地的行程次数。

输出:

## 
##  GSK Home 
##  105  100	

函数 table() 指示有 105 次行程去往 GSK,还有 100 次行程去往家。

我们可以过滤数据以返回一个包含 105 个观测值的数据集和另一个包含 100 个观测值的数据集。

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

输出:

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

输出:

## [1] 105  14

多个条件

我们可以用多个条件过滤数据集。例如,您可以提取目的地为家且发生在星期三的观察结果。

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

输出:

## [1] 23 14

23 个观察结果符合该标准。

管道

数据集的创建需要很多操作,例如:

  • 输入
  • 合并
  • 选择
  • 过滤
  • 等等

dplyr 库带有一个实用运算符 %>%,称为 管道. 流水线特性使得操作干净,快速,不易出错。

此运算符是一种执行步骤而不将中间步骤保存到硬盘的代码。如果您回到上面的示例,您可以选择感兴趣的变量并对其进行过滤。我们有三个步骤:

  • 步骤 1:导入数据:导入 GPS 数据
  • 步骤 2:选择数据:选择 GoingTo 和 DayOfWeek
  • 步骤 3:筛选数据:仅返回主页和星期三

我们可以用困难的方法来做这件事:

# 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)

输出:

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

这不是执行许多操作的便捷方式,尤其是在有很多步骤的情况下。环境最终会存储大量对象。

我们改用管道运算符 %>%。我们只需要定义开始时使用的数据框,所有流程都会从它开始。

管道基本语法

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.

您可以按照上面列举的步骤创建您的第一个管道。

# 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)

输出:

## [1] TRUE

我们准备使用管道操作员创建一个令人惊叹的数据集。

安排()

先前的教程中,您将学习如何使用函数 sort() 对值进行排序。库 dplyr 具有其排序函数。它与管道配合得天衣无缝。arrange() 动词可以对一行或多行重新排序,可以按升序(默认)或降序排列。

- `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

我们可以按照目的地对距离进行排序。

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

输出:

##     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

总结

在下表中,您总结了在本教程中学习到的所有操作。

动词 目的 代码 说明
一瞥 检查 df 的结构
glimpse(df)
与 str() 相同
选择() 选择/排除变量
select(df, A, B ,C)
选择变量 A、B 和 C
select(df, A:C)
选择从 A 到 C 的所有变量
select(df, -C)
排除 C
过滤() 根据一个或多个条件过滤 df
filter(df, condition1)
一个条件
filter(df, condition1
條件2)
安排() 使用一个或多个变量对数据集进行排序
arrange(A)
变量 A 升序排序
arrange(A, B)
对变量 A 和 B 进行升序排序
arrange(desc(A), B)
对变量 A 进行降序排序,对变量 B 进行升序排序
%>% 在每个步骤之间创建管道
step 1 %>% step 2 %>% step 3