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 |