<- flights |>
result_2 group_by(origin) |>
summarise(
= n(),
航班数 = mean(dep_delay, na.rm = TRUE)
平均延误时间 )
tidyverse初认识
1 第一题 编写代码
利用nycflights13包的flights数据集是2013年从纽约三大机场(JFK、LGA、EWR)起飞的所有航班的准点数据,共336776条记录。
计算纽约三大机场2013起飞航班数和平均延误时间(可使用group_by, summarise函数)
计算不同航空公司2013从纽约起飞航班数和平均延误时间
<- flights |> result_3 group_by(carrier) |> summarise( = n(), 航班数 = mean(dep_delay, na.rm = TRUE) 平均延误时间 )
计算纽约三大机场排名前三个目的地和平均飞行距离(可使用group_by, summarise, arrange, slice_max函数)
<- flights |> result_4 group_by(origin, dest) |> summarise( = n(), 航班数 = mean(distance, na.rm = TRUE) 平均距离 |> ) group_by(origin) |> slice_max(order_by = 航班数, n = 3)
`summarise()` has grouped output by 'origin'. You can override using the `.groups` argument.
2 第二题 解释代码
代码含义:
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
#tibble(iris):将iris数据集转换为tibble格式,arrange(Species, across(starts_with("Sepal"), desc):对数据进行排列,首先按照Species列进行升序排序,然后对以"Sepal"开头的列进行降序排序,across(starts_with("Sepal")):选择所有以"Sepal"开头的列。
代码含义:
%>% 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>
#starwars:这是一个内置的数据集,包含了《星球大战》系列电影中的角色信息,group_by(gender):按照gender列对数据进行分组,filter(mass > mean(mass, na.rm = TRUE)):筛选出mass(体重)大于该性别组平均体重的行,mean(mass, na.rm = TRUE):计算每组中mass列的平均值,na.rm = TRUE表示忽略缺失值。
代码含义:
%>% 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
#select(name, homeworld, species):从starwars数据集中选择name、homeworld和species三列,mutate(across(!name, as.factor)):对除了name列之外的所有列(即homeworld和species)进行类型转换,将它们转换为因子(factor)类型。
代码含义:
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
#tibble(mtcars):将mtcars数据集转换为tibble格式,group_by(vs):按照vs列(发动机类型,0表示V型发动机,1表示直列发动机)对数据进行分组,mutate(hp_cut = cut(hp, 3)):在数据集中创建一个新列hp_cut,该列将hp(马力)列的值分成3个区间(即低、中、高马力),group_by(hp_cut):最后,按照hp_cut列对数据进行分组。
3 第三题 查找帮助理解函数
阅读 https://dplyr.tidyverse.org/reference/mutate-joins.html 内容,说明4个数据集链接函数函数的作用。分别举一个实际例子演示并解释其输出结果。
library(dplyr)
# 学生表
<- tibble(
students student_id = c(1, 2, 3, 4),
name = c("Alice", "Bob", "Charlie", "David"),
course_id = c(101, 102, 103, 104) # 选修的课程ID
)
# 课程表
<- tibble(
courses course_id = c(101, 102, 104, 105),
course_name = c("Math", "Science", "History", "Art"),
credits = c(3, 4, 3, 2)
)
inner_join()
:#仅保留两个数据框中 键(key)完全匹配的行,丢弃所有不匹配的行。 <- inner_join(students, courses, by = "course_id") result print(result)
# A tibble: 3 × 5 student_id name course_id course_name credits <dbl> <chr> <dbl> <chr> <dbl> 1 1 Alice 101 Math 3 2 2 Bob 102 Science 4 3 4 David 104 History 3
left_join()
:#保留 左表(第一个表)的所有行,右表中无匹配的行填充 NA。 <- left_join(students, courses, by = "course_id") result print(result)
# A tibble: 4 × 5 student_id name course_id course_name credits <dbl> <chr> <dbl> <chr> <dbl> 1 1 Alice 101 Math 3 2 2 Bob 102 Science 4 3 3 Charlie 103 <NA> NA 4 4 David 104 History 3
right_join()
:#保留 右表(第二个表)的所有行,左表中无匹配的行填充 NA。 <- right_join(students, courses, by = "course_id") result print(result)
# A tibble: 4 × 5 student_id name course_id course_name credits <dbl> <chr> <dbl> <chr> <dbl> 1 1 Alice 101 Math 3 2 2 Bob 102 Science 4 3 4 David 104 History 3 4 NA <NA> 105 Art 2
full_join()
:#保留 两个表的所有行,无匹配的部分填充 NA。 <- full_join(students, courses, by = "course_id") result print(result)
# A tibble: 5 × 5 student_id name course_id course_name credits <dbl> <chr> <dbl> <chr> <dbl> 1 1 Alice 101 Math 3 2 2 Bob 102 Science 4 3 3 Charlie 103 <NA> NA 4 4 David 104 History 3 5 NA <NA> 105 Art 2