今天为大家介绍一个 R 语言数据分析必学的包:dplyr。
dplyr
是 tidyverse 包
的一部分,提供了许多操作数据框的工具,常用的有:
- filter 选择行
- select 选择列
- mutate 新增列
- arrange 排序
- summarize 生成摘要
这 5 个函数的工作方式都是相同的。
1、第一个参数是一个数据框。
2、随后的参数使用变量名称(不带引号)描述了在数据框上进行的操作。
3、输出结果是一个新数据框。
安装
代码语言:javascript复制# 最简单的方法,安装整个 tidyverse 包
install.packages("tidyverse")
# 或者,只安装 dplyr
install.packages("dplyr")
数据准备
我们用ggplot2
包中的mpg
数据为例,这个表记录了 234 辆汽车的品牌、型号、排量以及消耗每加仑汽油在高速公路上行驶的里程数等数据。
library(knitr)
library(dplyr)
library(ggplot2)
kable(head(mpg))
manufacturer | model | displ | year | cyl | trans | drv | cty | hwy | fl | class |
---|---|---|---|---|---|---|---|---|---|---|
audi | a4 | 1.8 | 1999 | 4 | auto(l5) | f | 18 | 29 | p | compact |
audi | a4 | 1.8 | 1999 | 4 | manual(m5) | f | 21 | 29 | p | compact |
audi | a4 | 2.0 | 2008 | 4 | manual(m6) | f | 20 | 31 | p | compact |
audi | a4 | 2.0 | 2008 | 4 | auto(av) | f | 21 | 30 | p | compact |
audi | a4 | 2.8 | 1999 | 6 | auto(l5) | f | 16 | 26 | p | compact |
audi | a4 | 2.8 | 1999 | 6 | manual(m5) | f | 18 | 26 | p | compact |
filter - 选择行
filter() 函数可以基于观测的值筛选出一个观测子集。第一个参数是数据框名称,第二个 参数以及随后的参数是用来筛选数据框的表达式。例如,以下命令会选择所有audi
品牌的车:
filter(mpg, manufacturer == 'audi')
代码语言:javascript复制## # A tibble: 18 × 11
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi a4 1.8 1999 4 auto… f 18 29 p comp…
## 2 audi a4 1.8 1999 4 manu… f 21 29 p comp…
## 3 audi a4 2 2008 4 manu… f 20 31 p comp…
## 4 audi a4 2 2008 4 auto… f 21 30 p comp…
## 5 audi a4 2.8 1999 6 auto… f 16 26 p comp…
## 6 audi a4 2.8 1999 6 manu… f 18 26 p comp…
## 7 audi a4 3.1 2008 6 auto… f 18 27 p comp…
## 8 audi a4 quattro 1.8 1999 4 manu… 4 18 26 p comp…
## 9 audi a4 quattro 1.8 1999 4 auto… 4 16 25 p comp…
## 10 audi a4 quattro 2 2008 4 manu… 4 20 28 p comp…
## 11 audi a4 quattro 2 2008 4 auto… 4 19 27 p comp…
## 12 audi a4 quattro 2.8 1999 6 auto… 4 15 25 p comp…
## 13 audi a4 quattro 2.8 1999 6 manu… 4 17 25 p comp…
## 14 audi a4 quattro 3.1 2008 6 auto… 4 17 25 p comp…
## 15 audi a4 quattro 3.1 2008 6 manu… 4 15 25 p comp…
## 16 audi a6 quattro 2.8 1999 6 auto… 4 15 24 p mids…
## 17 audi a6 quattro 3.1 2008 6 auto… 4 17 25 p mids…
## 18 audi a6 quattro 4.2 2008 8 auto… 4 16 23 p mids…
- 想知道 filter() 函数的更多用法,可在 Rstudio 的控制台输入
?filter
查看帮助文档,其他函数也一样。
select - 选择列
通过基于变量名的操作,select() 函数可以让你快速生成一个有用的变量子集。例如,以下命令选择表中的两列:manufacturer 和 model。
代码语言:javascript复制select(mpg, manufacturer, model)
代码语言:javascript复制## # A tibble: 234 × 2
## manufacturer model
## <chr> <chr>
## 1 audi a4
## 2 audi a4
## 3 audi a4
## 4 audi a4
## 5 audi a4
## 6 audi a4
## 7 audi a4
## 8 audi a4 quattro
## 9 audi a4 quattro
## 10 audi a4 quattro
## # … with 224 more rows
mutate - 新增列
除了选择现有的列,我们还经常需要添加新列,新列是现有列的函数。这就是 mutate() 函数的作用。
代码语言:javascript复制mutate(mpg, hwy2 = hwy 1) # 所有 hwy 的值加 1,然后生成一个新变量 hwy2
代码语言:javascript复制## # A tibble: 234 × 12
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi a4 1.8 1999 4 auto… f 18 29 p comp…
## 2 audi a4 1.8 1999 4 manu… f 21 29 p comp…
## 3 audi a4 2 2008 4 manu… f 20 31 p comp…
## 4 audi a4 2 2008 4 auto… f 21 30 p comp…
## 5 audi a4 2.8 1999 6 auto… f 16 26 p comp…
## 6 audi a4 2.8 1999 6 manu… f 18 26 p comp…
## 7 audi a4 3.1 2008 6 auto… f 18 27 p comp…
## 8 audi a4 quattro 1.8 1999 4 manu… 4 18 26 p comp…
## 9 audi a4 quattro 1.8 1999 4 auto… 4 16 25 p comp…
## 10 audi a4 quattro 2 2008 4 manu… 4 20 28 p comp…
## # … with 224 more rows, and 1 more variable: hwy2 <dbl>
arrange - 排序
arrange()
接受一个数据框和一组作为排序依据的列名(或者更复杂的表达式)作为参数。如果列名不只一个,那么就使用后面的列在前面排序的基础上继续排序:
arrange(mpg, model, displ)
代码语言:javascript复制## # A tibble: 234 × 11
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 toyota 4runner 4… 2.7 1999 4 manu… 4 15 20 r suv
## 2 toyota 4runner 4… 2.7 1999 4 auto… 4 16 20 r suv
## 3 toyota 4runner 4… 3.4 1999 6 auto… 4 15 19 r suv
## 4 toyota 4runner 4… 3.4 1999 6 manu… 4 15 17 r suv
## 5 toyota 4runner 4… 4 2008 6 auto… 4 16 20 r suv
## 6 toyota 4runner 4… 4.7 2008 8 auto… 4 14 17 r suv
## 7 audi a4 1.8 1999 4 auto… f 18 29 p comp…
## 8 audi a4 1.8 1999 4 manu… f 21 29 p comp…
## 9 audi a4 2 2008 4 manu… f 20 31 p comp…
## 10 audi a4 2 2008 4 auto… f 21 30 p comp…
## # … with 224 more rows
summarize - 生成摘要
最后一个核心函数是 summarize(),它可以将数据框折叠成一行:
代码语言:javascript复制summarise(mpg, avg_displ = mean(displ))
代码语言:javascript复制## # A tibble: 1 × 1
## avg_displ
## <dbl>
## 1 3.47
如果不与 group_by() 一起使用,那么 summarize() 也就没什么大用。group_by() 可以将分 析单位从整个数据集更改为单个分组。接下来,在分组后的数据框上使用 dplyr 函数时, 它们会自动地应用到每个分组。例如,我们想知道每个型号汽车的平均排量:
代码语言:javascript复制mpg %>% group_by(model) %>% summarize(avg_displ = mean(displ))
代码语言:javascript复制## # A tibble: 38 × 2
## model avg_displ
## <chr> <dbl>
## 1 4runner 4wd 3.48
## 2 a4 2.33
## 3 a4 quattro 2.42
## 4 a6 quattro 3.37
## 5 altima 2.8
## 6 c1500 suburban 2wd 5.52
## 7 camry 2.67
## 8 camry solara 2.64
## 9 caravan 2wd 3.39
## 10 civic 1.71
## # … with 28 more rows
group_by() 和 summarize() 的组合构成了使用 dplyr 包时最常用的操作之一:分组摘要。