Воспользуйтесь набором данных 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…
Есть ли в данных nycflights пропущенные значения?
Используя функции базового R выведите сумму пропущенных значений в наборе данных.
sum(is.na(nycflights))
## [1] 0
Для фильтрации строк по условию используйте функцию 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
Для выбора колонок по индексу и имени используйте функцию select()
Давайте начнем с индексов.
Воспользуйтесь подвыборкой рейсов, полученных в задании №3.
Отберите наиболее оптимальным способом первую, вторую, третью, одиннадцатую и двенадцатую колонки.
Не забывайте демонтрировать корректность решения!!
# отберём нужное
a <- filtered %>% select(c(1, 2, 3, 11, 12))
# проверим номера отобранных столбцов
which(colnames(filtered) %in% colnames(a))
## [1] 1 2 3 11 12
Теперь отберем колонки по имени.
Будет в самостоятельной работе
Воспользуйтесь подвыборкой рейсов, полученных в задании №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>
Не всегда можно и нужно перечислять в явном виде индексы или имена колонок для фильтрации.
Оставлять или удалять колонки можно на основании общих аттрибутов в их названиях.
Воспользуйтесь подвыборкой рейсов, полученных в задании №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
Необходимый паттерн в названии колонки не обязательно находится в начале названий.
Воспользуйтесь подвыборкой рейсов, полученных в задании №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
Отбирать строки по позициям можно с помощью функции 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>
Для вывода шапки набора данных можно использовать, например, функцию 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>
Очень полезно уметь отбирать случайным образом строки из набора данных.
Функция 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>
Отберите случайным образом 10% строк из набора данных nycflights.
Для выполнения задания исследуйте параметры функции slice_sample()
set.seed(666) # дабы воспроизводилось
random_flights <- slice_sample(nycflights, prop=0.1) # отберём нужное
nrow(nycflights) # сколько строк было
## [1] 32735
nrow(random_flights) # сколько строк стало
## [1] 3273
Обратите внимание на параметр 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
Воспользуйтесь подвыборкой рейсов, полученных в задании №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
С помощью функции 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
Добавить новый столбец к набору данных можно с помощью функции 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
С помощью функции 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
Переименовать колонки можно с помощью функции 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>
Переименовать колонки можно, применив к названиям какую-то единообразную операцию.
Это можно сделать с помощью функции 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
Оставить только уникальные строки в наборе данных или в конкретном столбце можно с помощью функции 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
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>
Воспользуйтесь полным набором данных nycflights.
С помощью средств базовой графики визуализируйте количество рейсов в каждом месяце.
Подпишите оси и название графика.
barplot(table(nycflights$month), xlab="Месяц", ylab="Количество рейсов", main="Количество рейсов по месяцам")
Воспользуйтесь полным набором данных nycflights.
С помощью средств базовой графики визуализируйте распределение времени задержки прибытия рейса (столбец arr_delay).
Подпишите оси и название графика.
hist(nycflights$arr_delay, xlab = "Время", ylab = "Количество", main = "Распределение времени задержки прибытия рейса")
Воспользуйтесь полным набором данных nycflights.
С помощью средств базовой графики изобразите точковую диаграму времени задержки отправления от задержки прибытия рейсов. Добавьте окрашивание по месяцам.
Подпишите оси и название графика.
plot(nycflights$arr_delay, nycflights$dep_delay, col = nycflights$month,
xlab = "Время задержки отправления",
ylab = "Время задержки прибытия")
# не особо информативный график
Решите задание №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
Решите задание №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