Семинар 5: введение в tidyverse и регулярные выражения

Все операции, связанные с обработкой данных (добавление столбцов, фильтрация строк и прочее), должны выполняться средствами библиотеки tidyverse.

Задание 0

Загрузите данные из файла Characters.csv, считая, что разделителем столбцов является точка с запятой и что текстовые столбцы должны считываться как строковые, а не как факторные. Сохраните их в датафрейм.

dat <- read.csv("https://allatambov.github.io/rprog/data/Characters.csv", 
                sep = ";", stringsAsFactors = FALSE)

Задание 1

Добавьте в датафрейм столбец Side со значениями Good и Bad, считая, что:

  • Good присваивается герою в случае, если в Loyalty у него есть слово “Order” или “Hogwarts”;
  • Bad — иначе.
library(tidyverse)
dat <- dat %>% mutate(Side = ifelse(str_detect(Loyalty, "Order") | 
                               str_detect(Loyalty, "Hogwarts"), 
                             "Good", "Bad"))

Задание 2

Используя критерий хи-квадрат, проверьте, правда ли есть связь между факультетом, на котором учился герой и тем, на чьей стороне он был (столбцы House и Loyalty соответственно).

chisq.test(dat$House, dat$Side)
## Warning in chisq.test(dat$House, dat$Side): Chi-squared approximation may be
## incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  dat$House and dat$Side
## X-squared = 55.146, df = 6, p-value = 4.331e-10

Задание 3

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

Подсказка: необходимо извлечь числа из столбца Wand (там, где они есть).

dat <- dat %>% mutate(Wand.length = as.numeric(str_extract(Wand, "\\d+")))

Задание 4

Добавьте в датафрейм числовой столбец Birth.year, который содержит год рождения героя.

Подсказка: необходимо извлечь числа из столбца Birth (там, где они есть).

dat <- dat %>% mutate(Birth.year = as.integer(str_extract(Birth, "\\d{4}")))

Задание 5

Добавьте в датафрейм числовой столбец End.year, который содержит следующие значения:

  • год из столбца Death, если герой умер (если соответствующая дата заполнена);
  • значение 2019, если герой не умирал.

Подсказка: можно сначала извлечь годы из столбца Death, а потом на месте пропущенных значений (случаи, где годы не нашлись) поставить 2019. Для заполнения пропусков с помощью tidyverse посмотрите на документацию к функции replace_na().

dat <- dat %>% mutate(End.year = as.integer(replace_na(str_extract(Death, "\\d{4}"), 
                                     2019)))

Задание 6

Добавьте в датафрейм числовой столбец Age, который содержит возраст героев (для простоты считаем, что возраст героев определяется как разность между годом в End.year и Birth.year).

dat <- dat %>% mutate(Age = End.year - Birth.year)

Задание 7

Выведите на экран в отдельной вкладке строки, которые соответствуют героям старше 100 лет, упорядочив их от самого младшего до самого старшего.

dat %>% filter(Age > 100) %>% arrange %>% View 

Задание 8

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

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

hist(dat$Age, col = "lightsalmon", main = "Age", xlab = "Age")
abline(v = 25, col = "firebrick", 
       lwd = 2, lty = 3)