利用nycflights13包的flights数据集是2013年从纽约三大机场(JFK、LGA、EWR)起飞的所有航班的准点数据,共336776条记录。
计算纽约三大机场2013起飞航班数和平均延误时间(可使用group_by, summarise函数)
# 加载必要的包
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)# 包含 dplyr
library(nycflights13) # 提供 flights 数据集
# 计算每个机场的航班数和平均延误时间
flights_stats <- flights %>%
filter(origin %in% c("JFK", "LGA", "EWR")) %>% # 筛选三大机场
group_by(origin) %>% # 按机场分组
summarise(
flights_count = n(), # 计算航班数
avg_dep_delay = mean(dep_delay, na.rm = TRUE) # 计算平均起飞延误(忽略NA)
)
# 查看结果
flights_stats
## # A tibble: 3 × 3
## origin flights_count avg_dep_delay
## <chr> <int> <dbl>
## 1 EWR 120835 15.1
## 2 JFK 111279 12.1
## 3 LGA 104662 10.3
library(tidyverse)
library(nycflights13)
# 获取航空公司名称(因为flights表中只有carrier代码)
airline_names <- airlines
# 计算各航空公司航班数和平均延误
flights %>%
left_join(airline_names, by = "carrier") %>% # 关联航空公司名称
filter(origin %in% c("JFK", "LGA", "EWR")) %>% # 筛选纽约机场
group_by(name) %>% # 按航空公司名称分组
summarise(
flights_count = n(), # 航班数
avg_dep_delay = mean(dep_delay, na.rm = TRUE) # 平均起飞延误
) %>%
arrange(desc(avg_dep_delay)) # 按延误时间降序排列
## # A tibble: 16 × 3
## name flights_count avg_dep_delay
## <chr> <int> <dbl>
## 1 Frontier Airlines Inc. 685 20.2
## 2 ExpressJet Airlines Inc. 54173 20.0
## 3 Mesa Airlines Inc. 601 19.0
## 4 AirTran Airways Corporation 3260 18.7
## 5 Southwest Airlines Co. 12275 17.7
## 6 Endeavor Air Inc. 18460 16.7
## 7 JetBlue Airways 54635 13.0
## 8 Virgin America 5162 12.9
## 9 SkyWest Airlines Inc. 32 12.6
## 10 United Air Lines Inc. 58665 12.1
## 11 Envoy Air 26397 10.6
## 12 Delta Air Lines Inc. 48110 9.26
## 13 American Airlines Inc. 32729 8.59
## 14 Alaska Airlines Inc. 714 5.80
## 15 Hawaiian Airlines Inc. 342 4.90
## 16 US Airways Inc. 20536 3.78
library(tidyverse)
library(nycflights13)
top_destinations <- flights %>%
# 筛选纽约三大机场数据
filter(origin %in% c("JFK", "LGA", "EWR")) %>%
# 关联机场名称数据
left_join(airports %>% select(faa, destination_name = name),
by = c("dest" = "faa")) %>%
# 计算每个机场-目的地组合的指标
group_by(origin, dest, destination_name) %>%
summarise(
avg_distance = mean(distance, na.rm = TRUE),
flights_count = n(),
.groups = "drop" # 明确取消分组,避免后续警告
) %>%
# 对每个机场选取航班量前三的目的地
group_by(origin) %>%
slice_max(flights_count, n = 3) %>%
# 整理输出格式
arrange(origin, desc(flights_count)) %>%
select(
origin_airport = origin,
destination_code = dest,
destination_name,
avg_distance_miles = avg_distance,
number_of_flights = flights_count
)
# 打印美观的结果
top_destinations %>%
mutate(avg_distance_miles = round(avg_distance_miles)) %>%
knitr::kable()
| origin_airport | destination_code | destination_name | avg_distance_miles | number_of_flights |
|---|---|---|---|---|
| EWR | ORD | Chicago Ohare Intl | 719 | 6100 |
| EWR | BOS | General Edward Lawrence Logan Intl | 200 | 5327 |
| EWR | SFO | San Francisco Intl | 2565 | 5127 |
| JFK | LAX | Los Angeles Intl | 2475 | 11262 |
| JFK | SFO | San Francisco Intl | 2586 | 8204 |
| JFK | BOS | General Edward Lawrence Logan Intl | 187 | 5898 |
| LGA | ATL | Hartsfield Jackson Atlanta Intl | 762 | 10263 |
| LGA | ORD | Chicago Ohare Intl | 733 | 8857 |
| LGA | CLT | Charlotte Douglas Intl | 544 | 6168 |
代码含义:这段代码对鸢尾花数据集(iris)做了排序处理:
首先将数据转为tibble格式(一种更现代的数据框)
然后按两个层次排序:
第一优先级:按花的种类(Species)升序排列(setosa → versicolor → virginica)
第二优先级:在每个种类组内,将所有”Sepal”开头的列(花萼长度和宽度)按数值从大到小降序排列
最终结果是分组排序后的数据,同种花按花萼尺寸从大到小排列。
tibble(iris) %>%
arrange(Species,across(starts_with("Sepal"), desc))
## # A tibble: 150 × 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <dbl> <dbl> <dbl> <dbl> <fct>
## 1 5.8 4 1.2 0.2 setosa
## 2 5.7 4.4 1.5 0.4 setosa
## 3 5.7 3.8 1.7 0.3 setosa
## 4 5.5 4.2 1.4 0.2 setosa
## 5 5.5 3.5 1.3 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 5.4 3.9 1.3 0.4 setosa
## 8 5.4 3.7 1.5 0.2 setosa
## 9 5.4 3.4 1.7 0.2 setosa
## 10 5.4 3.4 1.5 0.4 setosa
## # ℹ 140 more rows
分组:先按角色性别(gender)分组
筛选:在每个性别组内,筛选出体重大于该组平均体重的角色
使用na.rm = TRUE忽略缺失值计算平均体重
结果:最终得到的是各个性别组中,体重超过该组平均值的角色列表
例如:会分别计算男性、女性角色的平均体重,然后筛选出超过各自性别平均体重的角色。
starwars %>%
group_by(gender) %>%
filter(mass > mean(mass, na.rm = TRUE))
## # A tibble: 15 × 14
## # Groups: gender [3]
## name height mass hair_color skin_color eye_color birth_year sex gender
## <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 Darth … 202 136 none white yellow 41.9 male mascu…
## 2 Owen L… 178 120 brown, gr… light blue 52 male mascu…
## 3 Beru W… 165 75 brown light blue 47 fema… femin…
## 4 Chewba… 228 112 brown unknown blue 200 male mascu…
## 5 Jabba … 175 1358 <NA> green-tan… orange 600 herm… mascu…
## 6 Jek To… 180 110 brown fair blue NA <NA> <NA>
## 7 IG-88 200 140 none metal red 15 none mascu…
## 8 Bossk 190 113 none green red 53 male mascu…
## 9 Ayla S… 178 55 none blue hazel 48 fema… femin…
## 10 Gregar… 185 85 black dark brown NA <NA> <NA>
## 11 Lumina… 170 56.2 black yellow blue 58 fema… femin…
## 12 Zam We… 168 55 blonde fair, gre… yellow NA fema… femin…
## 13 Shaak … 178 57 none red, blue… black NA fema… femin…
## 14 Grievo… 216 159 none brown, wh… green, y… NA male mascu…
## 15 Tarfful 234 136 brown brown blue NA male mascu…
## # ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
## # vehicles <list>, starships <list>
列筛选:仅保留三个关键字段
name(角色名)
homeworld(母星)
species(物种)
类型转换:将除name外的列转为因子型(factor)
使用across(!name, as.factor)精准选择所有非名字列
转换后更适合统计分析和可视化
最终输出一个精简的tibble,包含角色名(字符型)及其分类信息(因子型)。这种处理常用于准备分类分析前的数据标准化。
starwars %>%
select(name, homeworld, species) %>%
mutate(across(!name, as.factor))
## # A tibble: 87 × 3
## name homeworld species
## <chr> <fct> <fct>
## 1 Luke Skywalker Tatooine Human
## 2 C-3PO Tatooine Droid
## 3 R2-D2 Naboo Droid
## 4 Darth Vader Tatooine Human
## 5 Leia Organa Alderaan Human
## 6 Owen Lars Tatooine Human
## 7 Beru Whitesun Lars Tatooine Human
## 8 R5-D4 Tatooine Droid
## 9 Biggs Darklighter Tatooine Human
## 10 Obi-Wan Kenobi Stewjon Human
## # ℹ 77 more rows
数据转换:将 mtcars 数据集转换为 tibble 格式(更现代的 data frame)
首次分组:按 vs 变量分组(发动机类型:0 = V型,1 = 直列型)
创建新变量:
将马力(hp)变量分成 3 个等宽区间(使用 cut() 函数)
新变量命名为 hp_cut(包含马力区间分组)
重新分组:最后按新创建的 hp_cut 变量重新分组数据
tibble(mtcars) %>%
group_by(vs) %>%
mutate(hp_cut = cut(hp, 3)) %>%
group_by(hp_cut)
## # A tibble: 32 × 12
## # Groups: hp_cut [6]
## mpg cyl disp hp drat wt qsec vs am gear carb hp_cut
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 (90.8,172]
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4 (90.8,172]
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 (75.7,99.3]
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1 (99.3,123]
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 (172,254]
## 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 (99.3,123]
## 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4 (172,254]
## 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2 (51.9,75.7]
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2 (75.7,99.3]
## 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4 (99.3,123]
## # ℹ 22 more rows
阅读 https://dplyr.tidyverse.org/reference/mutate-joins.html 内容,说明4个数据集链接函数函数的作用。分别举一个实际例子演示并解释其输出结果。
inner_join(``内连接
作用:仅保留两表中键值匹配的行(交集)示例:找出同时存在于两个表中的学生成绩``)
:
# 学生信息表
students <- tibble(id = 1:3, name = c("Alice", "Bob", "Charlie"))
# 成绩表
grades <- tibble(id = c(2,3,4), score = c(90, 85, 88))
inner_join(students, grades, by = "id")
## # A tibble: 2 × 3
## id name score
## <dbl> <chr> <dbl>
## 1 2 Bob 90
## 2 3 Charlie 85
left_join(``左连接作用:保留左表所有行,右表无匹配时填充NA示例:列出所有学生信息(含成绩,无成绩者标记NA)``)
:
left_join(students, grades, by = "id")
## # A tibble: 3 × 3
## id name score
## <dbl> <chr> <dbl>
## 1 1 Alice NA
## 2 2 Bob 90
## 3 3 Charlie 85
right_join(``右连接作用:保留右表所有行,左表无匹配时填充NA示例:列出所有成绩记录(含学生姓名,无姓名者标记NA)``)
:
right_join(students, grades, by = "id")
## # A tibble: 3 × 3
## id name score
## <dbl> <chr> <dbl>
## 1 2 Bob 90
## 2 3 Charlie 85
## 3 4 <NA> 88
full_join(``全连接作用:保留两表所有行,无匹配处填充NA示例:合并所有学生和成绩记录``)
:
full_join(students, grades, by = "id")
## # A tibble: 4 × 3
## id name score
## <dbl> <chr> <dbl>
## 1 1 Alice NA
## 2 2 Bob 90
## 3 3 Charlie 85
## 4 4 <NA> 88