Задание 1

Воспользуйтесь набором данных nycflights из пакета openintro.

Примените к данным nycflights функцию glimpse().

С помощью glimpse() можно получить сводку о данных, аналог str().

Выведите результат полностью.

# подключим нужные пакеты
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.3     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ 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(openintro)
## Загрузка требуемого пакета: airports
## Загрузка требуемого пакета: cherryblossom
## Загрузка требуемого пакета: usdata
# сводка о данных
glimpse(nycflights)
## Rows: 32,735
## Columns: 16
## $ year      <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, …
## $ month     <int> 6, 5, 12, 5, 7, 1, 12, 8, 9, 4, 6, 11, 4, 3, 10, 1, 2, 8, 10…
## $ day       <int> 30, 7, 8, 14, 21, 1, 9, 13, 26, 30, 17, 22, 26, 25, 21, 23, …
## $ dep_time  <int> 940, 1657, 859, 1841, 1102, 1817, 1259, 1920, 725, 1323, 940…
## $ dep_delay <dbl> 15, -3, -1, -4, -3, -3, 14, 85, -10, 62, 5, 5, -2, 115, -4, …
## $ arr_time  <int> 1216, 2104, 1238, 2122, 1230, 2008, 1617, 2032, 1027, 1549, …
## $ arr_delay <dbl> -4, 10, 11, -34, -8, 3, 22, 71, -8, 60, -4, -2, 22, 91, -6, …
## $ carrier   <chr> "VX", "DL", "DL", "DL", "9E", "AA", "WN", "B6", "AA", "EV", …
## $ tailnum   <chr> "N626VA", "N3760C", "N712TW", "N914DL", "N823AY", "N3AXAA", …
## $ flight    <int> 407, 329, 422, 2391, 3652, 353, 1428, 1407, 2279, 4162, 20, …
## $ origin    <chr> "JFK", "JFK", "JFK", "JFK", "LGA", "LGA", "EWR", "JFK", "LGA…
## $ dest      <chr> "LAX", "SJU", "LAX", "TPA", "ORF", "ORD", "HOU", "IAD", "MIA…
## $ air_time  <dbl> 313, 216, 376, 135, 50, 138, 240, 48, 148, 110, 50, 161, 87,…
## $ distance  <dbl> 2475, 1598, 2475, 1005, 296, 733, 1411, 228, 1096, 820, 264,…
## $ hour      <dbl> 9, 16, 8, 18, 11, 18, 12, 19, 7, 13, 9, 13, 8, 20, 12, 20, 6…
## $ minute    <dbl> 40, 57, 59, 41, 2, 17, 59, 20, 25, 23, 40, 20, 9, 54, 17, 24…

Задание 2

Есть ли в данных nycflights пропущенные значения?

Используя функции базового R выведите сумму пропущенных значений в наборе данных.

sum(is.na(nycflights))
## [1] 0

Задание 3

Для фильтрации строк по условию используйте функцию filter().

Отберите из набора данных nycflights июньские (столбец month) рейсы, которые вылетели (столбец origin) из аэропорта JFK и прилетели (столбец dest) в аэропорты LAX или ROC. Выполните фильтрацию за одну команду. Покажите, что вы точно отобрали только нужные аэропорты.

Сколько рейсов подходят под условия?

# отберём по условию
filtered <- filter(nycflights, month == 6 & origin == "JFK" & (dest == "LAX" | dest == "ROC"))
# проверим, что отобраны только нужные аэропорты
filtered %>% select(matches("origin|dest")) %>% unique()
## # A tibble: 2 × 2
##   origin dest 
##   <chr>  <chr>
## 1 JFK    LAX  
## 2 JFK    ROC
# посчитаем количество рейсов
nrow(filtered)
## [1] 109

Задание 4

Для выбора колонок по индексу и имени используйте функцию select()

Давайте начнем с индексов.

Воспользуйтесь подвыборкой рейсов, полученных в задании №3.

Отберите наиболее оптимальным способом первую, вторую, третью, одиннадцатую и двенадцатую колонки.

Не забывайте демонтрировать корректность решения!!

# отберём нужное
a <- filtered %>% select(c(1, 2, 3, 11, 12))
# проверим номера отобранных столбцов
which(colnames(filtered) %in% colnames(a))
## [1]  1  2  3 11 12

Задание 5

Теперь отберем колонки по имени.

Будет в самостоятельной работе

Воспользуйтесь подвыборкой рейсов, полученных в задании №3.

Удалите колонку с аэропортами, куда прилетали рейсы.

# удалим
filtered %>% select(-(dest)) %>% 
  # и посмотрим, что вышло
  head()
## # A tibble: 6 × 15
##    year month   day dep_time dep_delay arr_time arr_delay carrier tailnum flight
##   <int> <int> <int>    <int>     <dbl>    <int>     <dbl> <chr>   <chr>    <int>
## 1  2013     6    30      940        15     1216        -4 VX      N626VA     407
## 2  2013     6    17      940         5     1050        -4 B6      N351JB      20
## 3  2013     6    18     1838       103     2209       124 VX      N634VA     413
## 4  2013     6    14     1259        -1     1547        -8 VX      N642VA     411
## 5  2013     6    11     1934        24     2212       -28 AA      N338AA      21
## 6  2013     6    13     1028        -2     1353        28 AA      N339AA      19
## # ℹ 5 more variables: origin <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
## #   minute <dbl>

Задание 6

Не всегда можно и нужно перечислять в явном виде индексы или имена колонок для фильтрации.

Оставлять или удалять колонки можно на основании общих аттрибутов в их названиях.

Воспользуйтесь подвыборкой рейсов, полученных в задании №4.

Оставьте только колонки, иена которых начинаются с буквы d. Примените связку select() + starts_with()

# отберём нужное
filtered %>% select(starts_with("d")) %>%
  # и посмотрим, что вышло
  head()
## # A tibble: 6 × 5
##     day dep_time dep_delay dest  distance
##   <int>    <int>     <dbl> <chr>    <dbl>
## 1    30      940        15 LAX       2475
## 2    17      940         5 ROC        264
## 3    18     1838       103 LAX       2475
## 4    14     1259        -1 LAX       2475
## 5    11     1934        24 LAX       2475
## 6    13     1028        -2 LAX       2475

Задание 7

Необходимый паттерн в названии колонки не обязательно находится в начале названий.

Воспользуйтесь подвыборкой рейсов, полученных в задании №3.

Оставьте только такие колонки, которые в названии содержат “_” в любом месте. Примените связку select() + contains()

# отберём нужное
filtered %>% select(contains("_")) %>%
  # и посмотрим, что вышло
  head()
## # A tibble: 6 × 5
##   dep_time dep_delay arr_time arr_delay air_time
##      <int>     <dbl>    <int>     <dbl>    <dbl>
## 1      940        15     1216        -4      313
## 2      940         5     1050        -4       50
## 3     1838       103     2209       124      342
## 4     1259        -1     1547        -8      325
## 5     1934        24     2212       -28      314
## 6     1028        -2     1353        28      344

Задание 8

Отбирать строки по позициям можно с помощью функции slice()

Воспользуйтесь подвыборкой рейсов, полученных в задании №4.

Отберите первую, пятую и десятую строки.

# отберём нужные строки
filtered %>% slice(c(1, 5, 10))
## # A tibble: 3 × 16
##    year month   day dep_time dep_delay arr_time arr_delay carrier tailnum flight
##   <int> <int> <int>    <int>     <dbl>    <int>     <dbl> <chr>   <chr>    <int>
## 1  2013     6    30      940        15     1216        -4 VX      N626VA     407
## 2  2013     6    11     1934        24     2212       -28 AA      N338AA      21
## 3  2013     6     7     1931        21     2251        11 AA      N328AA      21
## # ℹ 6 more variables: origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>

Задание 9

Для вывода шапки набора данных можно использовать, например, функцию slice_head(), аналог функции head() из базового R.

Отберите первые 8 строк из полного набора данных nycflights.

nycflights %>% slice_head(n=8)
## # A tibble: 8 × 16
##    year month   day dep_time dep_delay arr_time arr_delay carrier tailnum flight
##   <int> <int> <int>    <int>     <dbl>    <int>     <dbl> <chr>   <chr>    <int>
## 1  2013     6    30      940        15     1216        -4 VX      N626VA     407
## 2  2013     5     7     1657        -3     2104        10 DL      N3760C     329
## 3  2013    12     8      859        -1     1238        11 DL      N712TW     422
## 4  2013     5    14     1841        -4     2122       -34 DL      N914DL    2391
## 5  2013     7    21     1102        -3     1230        -8 9E      N823AY    3652
## 6  2013     1     1     1817        -3     2008         3 AA      N3AXAA     353
## 7  2013    12     9     1259        14     1617        22 WN      N218WN    1428
## 8  2013     8    13     1920        85     2032        71 B6      N284JB    1407
## # ℹ 6 more variables: origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>

Задание 10

Очень полезно уметь отбирать случайным образом строки из набора данных.

Функция slice_sample() помогает это сделать разными способоами.

Выберите случайным образом 10 строк из полного набора данных nycflights.

Помните, что задания с случайным выбором должны быть воспроизводимы.

set.seed(666) # дабы воспроизводилось
slice_sample(nycflights, n=10)
## # A tibble: 10 × 16
##     year month   day dep_time dep_delay arr_time arr_delay carrier tailnum
##    <int> <int> <int>    <int>     <dbl>    <int>     <dbl> <chr>   <chr>  
##  1  2013     3     5     1605         5     1721         4 US      N751UW 
##  2  2013    12    14     2217        42      158        63 AA      N336AA 
##  3  2013    10    24     1820        80     2125        77 DL      N3745B 
##  4  2013     8     7     1727        -3     2111         1 DL      N711ZX 
##  5  2013    10     8     1557        -3     1857        10 B6      N639JB 
##  6  2013     5    10      857        -9     1208       -31 B6      N766JB 
##  7  2013    10     3     1023        -6     1237        23 AA      N569AA 
##  8  2013     9    30      939        19     1217        -3 VX      N633VA 
##  9  2013     5    23     1829        -6     2229        16 B6      N524JB 
## 10  2013     3    24      953         0     1313        10 UA      N417UA 
## # ℹ 7 more variables: flight <int>, origin <chr>, dest <chr>, air_time <dbl>,
## #   distance <dbl>, hour <dbl>, minute <dbl>

Задание 11

Отберите случайным образом 10% строк из набора данных nycflights.

Для выполнения задания исследуйте параметры функции slice_sample()

set.seed(666) # дабы воспроизводилось
random_flights <- slice_sample(nycflights, prop=0.1) # отберём нужное
nrow(nycflights) # сколько строк было
## [1] 32735
nrow(random_flights) # сколько строк стало
## [1] 3273

Задание 12

Обратите внимание на параметр weight_by функции slice_sample().

Для чего он нужен? Продемонстрируйте его работу на любом примере.

Этот параметр позваляет делать выборку с учётом веса элемента (вероятности выбрать его)

set.seed(666) # дабы воспроизводилось
# лол, пример из документации. Чем тяжелее машина, тем больше шансов, что она попадёт в выборку
mtcars %>% slice_sample(weight_by = wt, n = 5)
##                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Volvo 142E       21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
## Merc 450SE       16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Honda Civic      30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Pontiac Firebird 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Maserati Bora    15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

Задание 13

Воспользуйтесь подвыборкой рейсов, полученных в задании №3.

Выберите столбец tailnum двумя способами: с помощью функций pull() и select().

В чем разница?

filtered %>%
  pull(tailnum) # получили вектор
##   [1] "N626VA" "N351JB" "N634VA" "N642VA" "N338AA" "N339AA" "N505UA" "N629VA"
##   [9] "N628VA" "N328AA" "N635VA" "N249JB" "N622VA" "N193DN" "N702TW" "N338AA"
##  [17] "N627JB" "N319AA" "N238JB" "N707TW" "N508UA" "N634VA" "N336AA" "N336AA"
##  [25] "N238JB" "N283JB" "N508UA" "N518UA" "N718TW" "N332AA" "N193DN" "N630VA"
##  [33] "N178JB" "N652JB" "N5EAAA" "N329JB" "N635VA" "N192DN" "N338AA" "N557UA"
##  [41] "N508UA" "N319AA" "N805JB" "N640VA" "N14121" "N334JB" "N346JB" "N198DN"
##  [49] "N324AA" "N332AA" "N560UA" "N319AA" "N794JB" "N580JB" "N335AA" "N320AA"
##  [57] "N193DN" "N194DN" "N339AA" "N193DN" "N624VA" "N41135" "N192DN" "N508UA"
##  [65] "N48127" "N655JB" "N518UA" "N520JB" "N625VA" "N596UA" "N323AA" "N627VA"
##  [73] "N505UA" "N640VA" "N775JB" "N319AA" "N335AA" "N631VA" "N192DN" "N328AA"
##  [81] "N329AA" "N339AA" "N33132" "N335AA" "N637VA" "N336AA" "N193DN" "N557UA"
##  [89] "N189DN" "N633VA" "N336AA" "N197DN" "N355JB" "N597UA" "N640VA" "N324AA"
##  [97] "N323AA" "N327AA" "N709TW" "N339AA" "N625VA" "N373JB" "N228JB" "N296JB"
## [105] "N628VA" "N597JB" "N509JB" "N518UA" "N531JB"
filtered %>%
  select(tailnum) # получили таблицу
## # A tibble: 109 × 1
##    tailnum
##    <chr>  
##  1 N626VA 
##  2 N351JB 
##  3 N634VA 
##  4 N642VA 
##  5 N338AA 
##  6 N339AA 
##  7 N505UA 
##  8 N629VA 
##  9 N628VA 
## 10 N328AA 
## # ℹ 99 more rows

Задание 14

С помощью функции arrange() можно отсортировать данные по одному или нескольким столбцам по убыванию ли возрастанию.

Воспользуйтесь подвыборкой рейсов, полученных в задании №4.

Отсортируйте набор данных по столбцу day по убыванию.

a %>%
  arrange(desc(day)) %>%
  head()
## # A tibble: 6 × 5
##    year month   day origin dest 
##   <int> <int> <int> <chr>  <chr>
## 1  2013     6    30 JFK    LAX  
## 2  2013     6    30 JFK    LAX  
## 3  2013     6    30 JFK    LAX  
## 4  2013     6    30 JFK    LAX  
## 5  2013     6    30 JFK    LAX  
## 6  2013     6    29 JFK    LAX

Задание 15

Добавить новый столбец к набору данных можно с помощью функции mutate().

Новый столбец может быть результатом различных манипуляций, проведенных с уже существующими столбцами.

Воспользуйтесь подвыборкой рейсов, полученных в задании №4.

Добавьте к данным столбец YMD, который представляет собой слияние столбцов year, month, day вида: year_month_day (пример: 2023_9_18).

a %>%
  mutate(YMD = paste(year, month, day, sep="_")) %>%
  head()
## # A tibble: 6 × 6
##    year month   day origin dest  YMD      
##   <int> <int> <int> <chr>  <chr> <chr>    
## 1  2013     6    30 JFK    LAX   2013_6_30
## 2  2013     6    17 JFK    ROC   2013_6_17
## 3  2013     6    18 JFK    LAX   2013_6_18
## 4  2013     6    14 JFK    LAX   2013_6_14
## 5  2013     6    11 JFK    LAX   2013_6_11
## 6  2013     6    13 JFK    LAX   2013_6_13

Задание 16

С помощью функции transmute() можно создать новые колонки, удалив при этом все колонки, которые были раньше.

Воспользуйтесь исходными данными nycflights.

Создайте и оставьте только колонки:

YMD: аналогичная описанной в задании №15

dep_delay_abs: абсолютные значения колонки dep_delay

arr_delay_abs: абсолютные значения колонки arr_delay

nycflights %>%
  transmute(YMD = paste(year, month, day, sep="_"),
            dep_delay_abs = abs(dep_delay),
            arr_delay_abs = abs(arr_delay)) %>%
  head()
## # A tibble: 6 × 3
##   YMD       dep_delay_abs arr_delay_abs
##   <chr>             <dbl>         <dbl>
## 1 2013_6_30            15             4
## 2 2013_5_7              3            10
## 3 2013_12_8             1            11
## 4 2013_5_14             4            34
## 5 2013_7_21             3             8
## 6 2013_1_1              3             3

Задание 17

Переименовать колонки можно с помощью функции rename().

Воспользуйтесь исходными данными nycflights.

Переименуйте колонку dep_delay в Departure_delays_min.

nycflights %>%
  rename(Departure_delays_min = dep_delay) %>%
  head()
## # A tibble: 6 × 16
##    year month   day dep_time Departure_delays_min arr_time arr_delay carrier
##   <int> <int> <int>    <int>                <dbl>    <int>     <dbl> <chr>  
## 1  2013     6    30      940                   15     1216        -4 VX     
## 2  2013     5     7     1657                   -3     2104        10 DL     
## 3  2013    12     8      859                   -1     1238        11 DL     
## 4  2013     5    14     1841                   -4     2122       -34 DL     
## 5  2013     7    21     1102                   -3     1230        -8 9E     
## 6  2013     1     1     1817                   -3     2008         3 AA     
## # ℹ 8 more variables: tailnum <chr>, flight <int>, origin <chr>, dest <chr>,
## #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>

Задание 18

Переименовать колонки можно, применив к названиям какую-то единообразную операцию.

Это можно сделать с помощью функции rename_with().

Воспользуйтесь подвыборкой рейсов, полученных в задании №4.

Сделайте все буквы в названиях всех колонок заглавными.

a %>%
  rename_with(toupper) %>%
  head()
## # A tibble: 6 × 5
##    YEAR MONTH   DAY ORIGIN DEST 
##   <int> <int> <int> <chr>  <chr>
## 1  2013     6    30 JFK    LAX  
## 2  2013     6    17 JFK    ROC  
## 3  2013     6    18 JFK    LAX  
## 4  2013     6    14 JFK    LAX  
## 5  2013     6    11 JFK    LAX  
## 6  2013     6    13 JFK    LAX

Задание 19

Оставить только уникальные строки в наборе данных или в конкретном столбце можно с помощью функции distinct().

Воспользуйтесь исходными данными nycflights.

Выведите только уникальные значения столбца dest.

nycflights %>%
  distinct(dest)
## # A tibble: 102 × 1
##    dest 
##    <chr>
##  1 LAX  
##  2 SJU  
##  3 TPA  
##  4 ORF  
##  5 ORD  
##  6 HOU  
##  7 IAD  
##  8 MIA  
##  9 JAX  
## 10 ROC  
## # ℹ 92 more rows

Задание 20

n() - выводит число записей.

Отберите последние 10 строк из набора данных nycflights, используя функцию n().

nycflights %>%
  slice((n()-9):n())
## # A tibble: 10 × 16
##     year month   day dep_time dep_delay arr_time arr_delay carrier tailnum
##    <int> <int> <int>    <int>     <dbl>    <int>     <dbl> <chr>   <chr>  
##  1  2013    12    16     1437         8     1613       -10 9E      N916XJ 
##  2  2013     2     4     1558        -2     1854         4 DL      N3737C 
##  3  2013    10     3     1716         2     1812       -27 B6      N192JB 
##  4  2013     7    13     1923        18     2124        18 9E      N922XJ 
##  5  2013     1    28      706        36      909        22 EV      N13914 
##  6  2013    10     8      752        -8      921       -28 9E      N8505Q 
##  7  2013     7     7      812        -3     1043         8 DL      N6713Y 
##  8  2013     9     3     1057        -1     1319       -19 UA      N77871 
##  9  2013    10    15      844        56     1045        60 B6      N258JB 
## 10  2013     3    28     1813        -3     1942       -23 UA      N36272 
## # ℹ 7 more variables: flight <int>, origin <chr>, dest <chr>, air_time <dbl>,
## #   distance <dbl>, hour <dbl>, minute <dbl>

Задание 21

Воспользуйтесь полным набором данных nycflights.

С помощью средств базовой графики визуализируйте количество рейсов в каждом месяце.

Подпишите оси и название графика.

barplot(table(nycflights$month), xlab="Месяц", ylab="Количество рейсов", main="Количество рейсов по месяцам")

Задание 22

Воспользуйтесь полным набором данных nycflights.

С помощью средств базовой графики визуализируйте распределение времени задержки прибытия рейса (столбец arr_delay).

Подпишите оси и название графика.

hist(nycflights$arr_delay, xlab = "Время", ylab = "Количество", main = "Распределение времени задержки прибытия рейса")

Задание 23

Воспользуйтесь полным набором данных nycflights.

С помощью средств базовой графики изобразите точковую диаграму времени задержки отправления от задержки прибытия рейсов. Добавьте окрашивание по месяцам.

Подпишите оси и название графика.

plot(nycflights$arr_delay, nycflights$dep_delay, col = nycflights$month,
     xlab = "Время задержки отправления",
     ylab = "Время задержки прибытия")

# не особо информативный график

Задание 24

Решите задание №3 с помощью базового R.

(Отберите из набора данных nycflights июньские (столбец month) рейсы, которые вылетели (столбец origin) из аэропорта JFK и прилетели (столбец dest) в аэропорты LAX или ROC. Выполните фильтрацию за одну команду. Покажите, что вы точно отобрали только нужные аэропорты.

Сколько рейсов подходят под условия?)

# отберём по условию
filtered <- nycflights[which(nycflights$month == 6 &
                  nycflights$origin == "JFK" &
                  (nycflights$dest == "LAX"|nycflights$dest == "ROC" )),]
# проверим, что отобраны только нужные аэропорты
unique(select(filtered, matches("origin|dest")))
## # A tibble: 2 × 2
##   origin dest 
##   <chr>  <chr>
## 1 JFK    LAX  
## 2 JFK    ROC
# посчитаем количество рейсов
nrow(filtered)
## [1] 109

Задание 25

Решите задание №15 с помощью базового R.

(Новый столбец может быть результатом различных манипуляций, проведенных с уже существующими столбцами.

Воспользуйтесь подвыборкой рейсов, полученных в задании №4.

Добавьте к данным столбец YMD, который представляет собой слияние столбцов year, month, day вида: year_month_day (пример: 2023_9_18).)

a$YMD = paste(a$year, a$month, a$day, sep="_") # добавим
head(a) # посмотрим
## # A tibble: 6 × 6
##    year month   day origin dest  YMD      
##   <int> <int> <int> <chr>  <chr> <chr>    
## 1  2013     6    30 JFK    LAX   2013_6_30
## 2  2013     6    17 JFK    ROC   2013_6_17
## 3  2013     6    18 JFK    LAX   2013_6_18
## 4  2013     6    14 JFK    LAX   2013_6_14
## 5  2013     6    11 JFK    LAX   2013_6_11
## 6  2013     6    13 JFK    LAX   2013_6_13