R数据科学整洁之道:使用dplyr操作数据表

2022-11-11 16:11:14 浏览数 (2)

今天为大家介绍一个 R 语言数据分析必学的包:dplyr。

dplyrtidyverse 包的一部分,提供了许多操作数据框的工具,常用的有:

  • filter 选择行
  • select 选择列
  • mutate 新增列
  • arrange 排序
  • summarize 生成摘要

这 5 个函数的工作方式都是相同的。

1、第一个参数是一个数据框。

2、随后的参数使用变量名称(不带引号)描述了在数据框上进行的操作。

3、输出结果是一个新数据框。

安装

代码语言:javascript复制
# 最简单的方法,安装整个 tidyverse 包
install.packages("tidyverse")

# 或者,只安装 dplyr
install.packages("dplyr")

数据准备

我们用ggplot2包中的mpg数据为例,这个表记录了 234 辆汽车的品牌、型号、排量以及消耗每加仑汽油在高速公路上行驶的里程数等数据。

代码语言:javascript复制
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品牌的车:

代码语言:javascript复制
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()接受一个数据框和一组作为排序依据的列名(或者更复杂的表达式)作为参数。如果列名不只一个,那么就使用后面的列在前面排序的基础上继续排序:

代码语言:javascript复制
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 包时最常用的操作之一:分组摘要。

0 人点赞