作者: ls_本性
专题简介:本文章将介绍R语言中tidyverse中的dplyr包中的几个常用函数


R语言-dplyr

  • DPLYR包中函数相同的特性
  • 对行的操作
  • filter()
  • arrange()
  • distinct()
  • count()
  • 对列的操作
  • mutate()
  • select()
  • rename()
  • relocate()
  • 对组的操作
  • group_by()
  • summarize()
  • slice_
  • ungroup()
  • dpylr备忘录



在本章中,我们将重点介绍 dplyr 包,这是 tidyverse 的另一个核心成员。我们将使用 nycflights13 包中的数据来说明关键思想,并使用 ggplot2 来帮助我们理解数据。

DPLYR包中函数相同的特性

  1. 第一个参数始终是数据框。
  2. 后续参数通常使用变量名称(不带引号)描述要对哪些列进行操作。
  3. 输出始终是新数据框。

对行的操作

filter()

filter()允许您根据列的值保留行1.第一个参数是数据框。第二个和后续参数是必须为 true 才能保留行的条件。例如,我们可以找到晚点起飞超过 120 分钟(两小时)的所有航班:

library(tidyverse)
library(nycflights13)
flights %>% 
  filter(dep_delay>120)
#> # A tibble: 9,723 × 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      848           1835       853     1001           1950
#> 2  2013     1     1      957            733       144     1056            853
#> 3  2013     1     1     1114            900       134     1447           1222
#> 4  2013     1     1     1540           1338       122     2020           1825
#> 5  2013     1     1     1815           1325       290     2120           1542
#> 6  2013     1     1     1842           1422       260     1958           1535
#> # ℹ 9,717 more rows
#> # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>, …

还可以在filter()中使用条件表达:

# Flights that departed on January 1
flights %>% 
  filter(month == 1 & day == 1)
#> # A tibble: 842 × 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # ℹ 836 more rows
#> # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>, …

# Flights that departed in January or February
flights %>%
  filter(month %in% c(1, 2))
#> # A tibble: 51,955 × 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # ℹ 51,949 more rows
#> # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>, …

arrange()

arrange()根据列的值更改行的顺序。它需要一个数据框和一组列名(或更复杂的表达式)来排序。如果提供多个列名,则每增加一列将用于断开前面列的值中的连接。例如,以下代码按出发时间排序,该时间分布在四列中。我们首先得到最早的几年,然后在一年内得到最早的几个月,依此类推。

flights %>%
  arrange(year, month, day, dep_time)
#> # A tibble: 336,776 × 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # ℹ 336,770 more rows
#> # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>, …

您可以使用 中的列,根据该列按降序(从大到小)对数据框重新排序。例如,此代码从延误次数最多到延误次数最少对航班进行排序:

flights %>% 
  arrange(desc(dep_delay))
#> # A tibble: 336,776 × 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     9      641            900      1301     1242           1530
#> 2  2013     6    15     1432           1935      1137     1607           2120
#> 3  2013     1    10     1121           1635      1126     1239           1810
#> 4  2013     9    20     1139           1845      1014     1457           2210
#> 5  2013     7    22      845           1600      1005     1044           1815
#> 6  2013     4    10     1100           1900       960     1342           2211
#> # ℹ 336,770 more rows
#> # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>, …

distinct()

distinct()查找数据集中的所有唯一行,因此从技术意义上讲,它主要对行进行操作。但是,大多数情况下,您需要某些变量的不同组合,因此您还可以选择提供列名称:

# Remove duplicate rows, if any
flights |> 
  distinct()
#> # A tibble: 336,776 × 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # ℹ 336,770 more rows
#> # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>, …


# Find all unique origin and destination pairs
flights |> 
  distinct(origin, dest)
#> # A tibble: 224 × 2
#>   origin dest 
#>   <chr>  <chr>
#> 1 EWR    IAH  
#> 2 LGA    IAH  
#> 3 JFK    MIA  
#> 4 JFK    BQN  
#> 5 LGA    ATL  
#> 6 EWR    ORD  
#> # ℹ 218 more rows

或者,如果要在筛选唯一行时保留其他列,则可以使用该选项。.keep_all = TRUE

flights %>%
  distinct(month,year,.keep_all=TRUE)
  # A tibble: 12 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013     1     1      517            515         2      830
 2  2013    10     1      447            500       -13      614
 3  2013    11     1        5           2359         6      352
 4  2013    12     1       13           2359        14      446
 5  2013     2     1      456            500        -4      652
 6  2013     3     1        4           2159       125      318
 7  2013     4     1      454            500        -6      636
 8  2013     5     1        9           1655       434      308
 9  2013     6     1        2           2359         3      341
10  2013     7     1        1           2029       212      236
11  2013     8     1       12           2130       162      257
12  2013     9     1        9           2359        10      343
# ℹ 12 more variables: sched_arr_time <int>, arr_delay <dbl>,
  • 注意 :参数.kepp_all中最前面有个点

count()

统计个数

flights |>
  count(origin, dest, sort = TRUE)
#> # A tibble: 224 × 3
#>   origin dest      n
#>   <chr>  <chr> <int>
#> 1 JFK    LAX   11262
#> 2 LGA    ATL   10263
#> 3 LGA    ORD    8857
#> 4 JFK    SFO    8204
#> 5 LGA    CLT    6168
#> 6 EWR    ORD    6100
#> # ℹ 218 more rows

对列的操作

mutate()

添加从现有列计算的新列:

flights %>%
  mutate(
    gain = dep_delay - arr_delay,
    speed = distance / air_time * 60
  )
#> # A tibble: 336,776 × 21
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # ℹ 336,770 more rows
#> # ℹ 13 more variables: arr_delay <dbl>, carrier <chr>, flight <int>, …

默认情况下, 会在数据集的右侧添加新列,这使得很难看到此处发生的情况。我们可以用.before参数将变量添加到左侧:

flights %>%
  mutate(
    gain = dep_delay - arr_delay,
    speed = distance / air_time * 60,
    .before = 1
  )
#> # A tibble: 336,776 × 21
#>    gain speed  year month   day dep_time sched_dep_time dep_delay arr_time
#>   <dbl> <dbl> <int> <int> <int>    <int>          <int>     <dbl>    <int>
#> 1    -9  370.  2013     1     1      517            515         2      830
#> 2   -16  374.  2013     1     1      533            529         4      850
#> 3   -31  408.  2013     1     1      542            540         2      923
#> 4    17  517.  2013     1     1      544            545        -1     1004
#> 5    19  394.  2013     1     1      554            600        -6      812
#> 6   -16  288.  2013     1     1      554            558        -4      740
#> # ℹ 336,770 more rows
#> # ℹ 12 more variables: sched_arr_time <int>, arr_delay <dbl>, …

这是一个符号,它是函数的参数,而不是我们正在创建的第三个新变量的名称。您还可以使用 在变量后添加,在两者中,您可以使用变量名称而不是位置。例如,我们可以在day列之后添加新变量

flights %>%
  mutate(
    gain = dep_delay - arr_delay,
    speed = distance / air_time * 60,
    .after = day
  )
  • 注意:mutate()函数新添加的列如果和原有的列同名,就会覆盖原来的列。

select()

选择需要的变量(可基于变量名称选择,也可基于第几列)

#选择天
flights %>% 
  select(day)
fligths %>%
  select(3)
#选择年、月、日
fligths %>%
  select(year:day)
fligths %>%
  select(1:3)
#选择除去年月日之外所以列
fligths %>%
  select(!year:day)
  fligths %>%
  select(!1:3)
 #选择字符串的列
 flights %>%
  select(where(is.character))

rename()

重新命名

  • 注意janitor::clean_names()可以使名字统一化
flights %>% 
  rename("生产"=day) %>%
  clean_names()
  A tibble: 336,776 × 19
    year month sheng_chan dep_time sched_dep_time dep_delay arr_time
   <int> <int>      <int>    <int>          <int>     <dbl>    <int>
 1  2013     1          1      517            515         2      830
 2  2013     1          1      533            529         4      850
 3  2013     1          1      542            540         2      923
 4  2013     1          1      544            545        -1     1004
 5  2013     1          1      554            600        -6      812
 6  2013     1          1      554            558        -4      740
 7  2013     1          1      555            600        -5      913
 8  2013     1          1      557            600        -3      709
 9  2013     1          1      557            600        -3      838
10  2013     1          1      558            600        -2      753
# ℹ 336,766 more rows

relocate()

用于移动变量,默认移动在最前面,也有.before,.after参数,用法和mutate()函数中的相同

对组的操作

group_by()

分组

flights %>%
  group_by(month)
#> # A tibble: 336,776 × 19
#> # Groups:   month [12]
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # ℹ 336,770 more rows
#> # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>, …

summarize()

最重要的分组操作是汇总运算,如果用于计算单个汇总统计数据,则会将数据框减少为每个组具有一行。在 dplyr 中,此操作由summarize()3,如以下示例所示,该示例按月计算平均出发延迟:

flights %>% 
  group_by(month) %>% 
  summarize(
    delay = mean(dep_delay, na.rm = TRUE),
    count=n()
  )
# A tibble: 12 × 3
   month delay count
   <int> <dbl> <int>
 1     1 10.0  27004
 2     2 10.8  24951
 3     3 13.2  28834
 4     4 13.9  28330
 5     5 13.0  28796
 6     6 20.8  28243
 7     7 21.7  29425
 8     8 12.6  29327
 9     9  6.72 27574
10    10  6.24 28889
11    11  5.44 27268
12    12 16.6  28135

slice_

有五个方便的函数允许您提取每个组中的特定行:

  • df |> slice_head(n = 1)从每个组中获取第一行。
  • df |> slice_tail(n = 1)取每组中的最后一行。
  • df |> slice_min(x, n = 1)取列 值最小的行。
  • df |> slice_max(x, n = 1)取列 值最大的行。
  • df |> slice_sample(n = 1)随机取一行。

ungroup()