作者: 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包中函数相同的特性
- 第一个参数始终是数据框。
- 后续参数通常使用变量名称(不带引号)描述要对哪些列进行操作。
- 输出始终是新数据框。
对行的操作
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()