322 гр., спец. СМ. Спецкурс «Введение в обработку данных»
Место и время проведения: вторник, третья пара (13:40-15:15), ауд. 3534
Преподаватель: Гученко Роман Александрович
Программа¶
Занятие 1:¶
Занятие 2:¶
- R как калькулятор: +, -, *, /, ^; abs, sqrt, log, sin, cos, exp; %%, %/%
- Встроенная справка, функция ?
- Ввод длинных строк
- Экспоненциальная запись чисел
- Округление: функции floor, ceiling, round
- Операторы присваивания в R: <-, ->, =
- Названия переменных, правила
- Workspace: ls, rm
- Создание векторов: c, :
- Векторы и “скаляры” (векторы длины 1)
- Типы (atomic) векторов: numeric (integer, double, complex), character, logical, raw
- Конверсия типов векторов
- Проверка типа вектора (typeof, is.numeric, is.integer, is.double, is.logical, is.complex, is.raw)
- Изменение типа вектора (as.numeric, as.integer, as.double, as.logical, as.complex, as.raw)
- seq, length
- Доступ к элементам вектора (оператор [], как работает со “скалярами” и integer векторами)
- Поэлементная арифметика с векторами
- Векторы, правило переписывания
- Сравнение векторов. Операторы <, <=, ==, >=, >, !=
- min, max, which.min, which.max, which, sum, prod, sort, rev
- Два слова про картинки. Функция plot
- Задание 1: про нахождение максимумов функции на сетке
- Объекты в R как C-struct’ы; размеры векторов в памяти, размеры “скаляров”
r_vector2:
- NULL object
- Векторы длины 0
- factorial, mean, diff
- : для создания double и убывающих последовательностей
- [] в связке с logical векторами, [] и отрицательные индексы
- logical векторы: !, &, |, XOR; && и || для “скаляров”; isTRUE
- Присваивание значений части вектора; правило переписывания в этом случае
- T, F; арифметика с logical
- Missing values, NA и арифметика, NA и логические операции, NA при сравнении, NA и функции для работы с векторами
- -Inf, Inf, NaN
- is.na, is.nan
- Задание 2: про замену части синусоиды на квадратичную функцию
Занятие 3:¶
r_vector3:
- pmin, pmax
- cumsum, cumprod, cummin, cummax
- rep
- Равенство векторов: all.equal, identical
- order
- Задание 3: численное интегрирование и дифференцирование; посчитать функцию распределения для нормального распределения на отрезке [-4,4]
- median; когда лучше использовать вместо mean
- Character векторы и string pool; размер character вектора
- Работа со строками: nchar - длина строк в character векторе, substr - выбор подстрок, paste и paste0 - конкатенация строк
- unique
- Имена для элементов вектора
- factor; factor vs character vector; потребление памяти; скорость поэлементного сравнения с заданной строкой
r_list:
- Создание списков, функция list
- Доступ к элементам, разница между операторами [] и [ [ ] ]
- Имена для элементов списка
- Обновление элементов списка
- Конкатенация списков с помощью c()
- Конвертация списка в вектор с помощью unlist
- Пустой список, append
- Списки и память. Список как массив указателей на произвольные объекты. Почему список из “скаляров” - не всегда хорошая идея
Control flow (https://adv-r.hadley.nz/control-flow.html; самостоятельное изучение):
- Условный оператор: if(){}, if(){}else{}, if(){}else if(){}else{}; что можно передавать в качестве условия, а что - нельзя
- Функции ifelse и switch
- Циклы for, while и repeat
Занятие 4:¶
r_matrix1:
- Создание матриц; numeric, character и logical матрицы
- Доступ к элементам, выделение строк, столбцов, подматриц
- Размерность: dim vs length
- rbind, cbind
- Поэлементная арифметика
- Транспонирование, выделение и изменение диагонали
- rowSums, colSums: разница в скорости; sum в случае матриц
- rowMeans, colMeans
- Логические операции, замена части элементов матрицы по условию
- Как матрицы хранятся в памяти? Как сделать матрицу из вектора с помощью изменения атрибута dim? Приводит ли это к изменениям основных данных?
- Про атрибуты объектов в R
- Дополнительные атрибуты матриц: имена строк и столбцов
- Умножение матриц, оператор %*%; Умножение матрицы на вектор слева и справа, вектор-строка и вектор-столбец
r_matrix2:
- Задание 4: решение систем линейных уравнений, интерполяция полиномом
- Задание 5: умножение матриц, поиск компонент связности в графе
- Задание 6: умножение матриц, поиск стационарного распределения марковской цепи, PageRank
Занятие 5:¶
r_function:
- Синтаксис создания функций
- Копирует ли R объекты при передаче их в функцию в качестве аргументов? Хитрое поведение в стиле: передаю по указателю, но если надо изменить объект во время исполнения, создаю копию внутри пространства имен функции, работаю дальше с ней, не меняя исходный объект. Исключения из этого правила
- Анонимные функции
- Функции от функций; встроенные функции от функций: apply, lapply, sapply
- Функции возвращающие функции
- Ленивые вычисления
- Правила передачи аргументов
r_data_frame:
- Создание data.frame’ов “руками”; функция data.frame; правило переписывания при создании колонок
- Имена строк и столбцов (функции row.names и names)
- typeof и class data.frame’а
- Структура data.frame’а, функция str, получение информации о типе столбцов
- nrow, ncol, dim
- Доступ к столбцам data.frame’а:
- поведение оператора [,] при передаче “скаляра”, положительного integer вектора, отрицательного integer вектора, character вектора, logical вектора;
- повторяющиеся integer индексы в [,];
- правило переписывания при передаче в [,] logical векторов;
- поведение [,] при добавлении drop=F;
- оператор [] и оператор [ [ ] ], аналогия с list
- оператор \$
- Доступ к строкам:
- [,] для integer, character, logical;
- выделяем строчки по логическому условию на столбцы;
- правило переписывания
- Доступ к элементам, выделение подdata.frame’ов
- summary, что показывает для numeric, logical, character и factor колонок; отступление про quantile
- rbind и cbind для data.frame’ов; дубликаты в именах колонок
- Добавление строк в конец data.frame’а; стоимость этой операции
- Добавление столбцов
- Сортировка строк data.frame’а через order; сортировка по одной и нескольким колонкам
- Сортировка столбцов data.frame’а; копирование указателей на колонки data.frame’а и стоимость этой операции; реальная копия данных при попытке изменения колонки, последствия для производительности
- with и within
- join’ы, функция merge: inner, left, right, full
Дополнительное чтение на дом:
https://adv-r.hadley.nz/names-values.html
- подробнее про то, когда R делает копию объекта при выполнении оператора присваивания, а когда создает новый объект
- еще раз про допустимые названия переменных
- функция tracemem для лучшего понимания механизма копирования
- еще раз про копирование указателей на элементы списка и колонки data.frame’а при выполнении оператора присваивания
- еще раз про дороговизну изменения строк в data.frame’е
- еще раз про string pool
- modify-in-place без копирования
- немного про garbage collector
https://adv-r.hadley.nz/vectors-chap.html
- atomic vector, list, data.frame - все это vector’ы
- подробнее про атрибуты объектов в R; names и dim атрибуты
- array - массив с произвольным dim
- factor как надстройка над integer векторами (уже обсуждали)
- date и date-time как надстройка над double векторами
- tibble - осовремененный data.frame
- синтаксис создания list-колонок в data.frame и tibble
https://adv-r.hadley.nz/subsetting.html
- x[] и оператор присваивания
https://adv-r.hadley.nz/functions.html
- еще раз про lazy evaluation
- оператор … (ellipsis, три точки)
https://adv-r.hadley.nz/environments.html
- про объекты типа environment; для эрудиции
Занятие 6:¶
r_iris:
- Функция data для загрузки встроенных данных
- Данные iris
- Функция aggregate
- Концепция split-apply-combine (https://vita.had.co.nz/papers/plyr.pdf - для исторического контекста, мы будем потом изучать более новые пакеты, чем plyr)
- Создание векторов с именованными элементами с помощью функции setNames
- do.call, передача произвольного количества аргументов в функцию с ellipsis-оператором
- Использование регулярных выражений в strsplit (ChatGPT в этом деле - отличный помощник; чтобы научиться писать регулярные выражения самостоятельно, есть отличный сайт: https://regexone.com)
- Рисование гистограмм, функция hist
- Работа с цветом, функция rgb, прозрачность
- Разбор аргументов из ellipsis-оператора; list(…)
- Оператор %in% для проверки наличия конкретных элементов в векторе
- Аргумент breaks функции hist; custom breaks
- Функция hist с параметром plot = FALSE; объект histogram; plot от объекта histogram
- Подробнее про функцию plot и рисование в целом; аргументы col, xlim, ylim, xlab, ylab, main
- Добавление графиков на текущее графическое устройство; add = TRUE в функциях для рисования
- Функция plot и рисование scatter plot’ов; как раскрашивать точки на scatter plot’ах в разные цвета
- Графические параметры и функция par
- Несколько графиков рядом, разбиение графического устройства на части с помощью параметра mfrow
- scatter matrix своими руками
- Функция legend
Дополнительное чтение на дом:
https://adv-r.hadley.nz/fp.html
https://adv-r.hadley.nz/functionals.html
https://adv-r.hadley.nz/function-factories.html
https://adv-r.hadley.nz/function-operators.html
Занятие 7:¶
r_iris2:
- Split-apply-combine, другой вариант через split, lapply и rbind
- Функция expand.grid; data.frame из комбинаций входящих в качестве аргументов векторов
- Функция split; физическое разделение data.frame‘а по значению в одной из колонок на список из data.frame’ов - get - нахождение объекта в environment’е по имени - Pipeline оператор |> - Изменение атрибутов в пайплайне на примере rownames - Функция density; plot от объекта типа density - Гистограммы и плотности на одном графике - Функция lines - Аргумент type функции plot; использование type = ’n’
- Функция polygon
- Функция pairs для рисования scatterplot матрицы
tracemem.R:
- tracemem и матрицы; присваивание значений элементам, строкам, столбцам и подматрицам in-place
- tracemem и data.frame’ы; копирование при изменении
r_gradient_method:
- contour, рисование линий уровня, данные volcano
- Поточечный поиск максимума в матрице, функция which с аргументом arr.ind = TRUE
- Функция двух переменных, векторизованный вариант
- Пакет rgl, рисование трехмерных графиков поверхностей и scatterplot’ов с помощью функции plot3d
- **Задание 7: градиентный метод для функции с двумя “скалярными” аргументами **
- Функция arrow, рисование пути градиентного метода стрелочками поверх линий уровня
- Градиентный метод для функции с одним векторным аргументом
- Самодельная функция для вычисления градиента; случаи, когда циклов не избежать
- Напоминание: добавление элементов в вектор в цикле; почему это плохо, когда на это можно не обращать внимания
- Самодельная версия expand.grid, которая возвращает матрицу, а не data.frame; аргументы times и each функции rep
- Библиотека numDeriv, пакетная функция grad для вычисления градиента
- Функция optim для нахождения минимума функции с векторным аргументом
r_gradient_method2_:
- Градиентный метод для функции с двумя “скалярными” аргументами; более продвинутая функция с возможностью выбора критерия остановки
- Использование ленивых вычислений для задания функции со значениями аргументов по умолчанию, использующими еще не определенные переменные
- Градиентный метод для функции с одним векторным аргументом; более продвинутая функция с возможностью выбора критерия остановки и способа вычисления градиента
- Сравнение количества итераций алгоритма для разных критериев остановки
- Сравнение пакетного, самописного и аналитически вычисленного градиента
- Изучение кода функции optim, правила хорошего тона при обработке аргументов в динамически типизированном языке внутри самописных функций, функции warning и stop для обработки исключений
Misc¶
- динамическая генерация кода и его исполнение с помощью функции eval
- optim, integrate
- Замечание про копирование при df[df[col] == col.val,]
- uniroot, multiroot
- градиентный метод руками и с помощью готовых функций
Домашние задания¶
| Задание 1 | Задание 2 | Задание 3 | Задание 4 | Задание 5 | Задание 6 | Задание 7 | |
|---|---|---|---|---|---|---|---|
| Плоткин Глеб | NA | NA | NA | NA | NA | NA | NA |
| Погребников Николай | + | + | + | + | + | + | NA |
| Поликанин Евгений | + | + | + | + | + | + | + |
| Симоненко Вадим | + | + | + | + | + | + | + |
| Яковлев Денис | + | + | + | + | + | + | + |