Язык R

и его применение в биоинформатике

Лекция 1

Анастасия Жарикова

1 сентября 2023

Общая информация

Преподаватели

  • Жарикова Анастасия Александровна

    azharikova89@gmail.com

  • Валяева Анна Александровна

    valyaeva.ann@gmail.com

Где нас найти

  • Ходите на занятия

  • Общий чат ТГ

  • Комната 633, корпус Б

Зачем нас искать

  • Задавать вопросы(!!!!)

    на занятиях

    лично очно

    общий чат ТГ

    личные сообщения

  • Ночью и по выходным мы не работаем!

  • За сутки до любого дедлайна - день тишины!

Если вы не задаете вопросы, значит вы все поняли, и мы можем спрашивать материал в полном объеме, задавать больше домашних заданий и усложнять самостоятельные и контрольные работы

Что будет

Активности

  • 17 занятий

  • 14 лекций

  • 13 ДЗ

  • 11 самостоятельных работ

  • 2 контрольных работы

  • Защита проекта

Все материалы будут выложены на странице курса

Расписание

Занятия очные по пятницам

  • Группа 301, 10:55-12:30, аудитория 442

  • Группа 302, 17:20-18:55, аудитория 207

  • Контрольные работы ~ 27 октября и 24 ноября

  • Защита проектов ~ 22 декабря

  • Ходить можно только со своей группой (или поменяться)

  • Не ходить без потери баллов можно по уважительным причинам (справка в учебной части, поездка на конференцию)

Набираем баллы

Баллы

  • За домашние, самостоятельные и контрольные работы начисляют первичные баллы (ПБ)

  • Первичные баллы пересчитывают во вторичные быллы (ВБ) с учетом веса активности

  • За проект сразу начисляют ВБ

  • Максимум за курс можно получить 100 ВБ

  • Преподаватели могут начислять (и отнимать!) дополнительные баллы за особые достижения

Ценность активностей

  • Домашние задания - 20 ВБ

  • Самостоятельные работы - 20 ВБ

  • Контрольные работы - 30 ВБ

  • Защита проектов - 30 ВБ

  • Домашние задания можно сдавать только 1 раз

  • В большинстве случаев на выполнение домашнего задания дается 2 недели

  • Дедлайны по воскресеньям (почти всегда)

  • Мы можем ИНОГДА двигать дедлайны по запросу студентов

  • Самостоятельные и контрольные работы не переписываются

Работа с материалом курса

  • На первом занятии познакомимся с языком R, средой разработки RStudio, основными концепциями

  • На дом вы получите материалы для самостоятельного изучения и домашнее задание

  • На следующем занятии пишем самостоятельную работу по материалам, выданным ранее для самостоятельного изучения

  • На занятии обсуждаем только самые важные и сложные аспекты темы

  • На занятии разбираем примеры повышенной сложности

  • На дом вы получаете материалы для самостоятельного изучения и домашнее задание

и т.д. …

Материалы для самостоятельного изучения

  • Слайды с 🏠

  • Список функций для изучения

  • Отдельная презентация

  • Список внешних источников

Зачет

Зачета не будет

Как же получить зачет

  • Максимально участвовать в активностях

  • Набрать как минимум 5 ВБ от каждой активности

  • Набрать в итоге более 60 ВБ

Окончательное количество проходных для зачета баллов будет установлено ПОСЛЕ защиты проектов

Допускаем недобор 1 балла, не больше

Грубые ошибки при защите проекта могут обнулить все ваши старания…

Важно!

В курсе будут задачи и вопросы, касающиеся других предметов (например, статистика, молекулярная биология).

Считается, что все предметы из прошлых семестров (и из школы) вы усвоили.

Мы не повторяем статистику, но спрашиваем!

Непонимание материала прошлых семестров считается грубыми ошибками при защите проекта

Пересдача

Пересдачи будут

Пересдачи

  • Нужно набрать недостающее количество баллов

  • Подготовить к пересдаче необходимое количество индивидуальных проектов

  • Ответить на теоретические вопросы:

    по R

    по статистике

    по материалу проекта

Допускаем недобор 1 балла, не больше

Зачем это все

Инструментарий

Набор разных инструментов и навыков делает специалиста по анализу данных более разносторонним и гибким

Интеграция в существующие проекты

Структура курса

R

  • Язык R распространяется бесплатно с открытым исходным кодом

  • Доступно для Linux, macOS, Windows

  • Интерпретируемый язык программирования

  • Обширное сообщество разработчиков

RStudio

Интегрированная среда разработки (одна из)

Установка и знакомство

Установка

На свой ноутбук необходимо установить:

  • сначала язык R

  • затем RStudio

Вперед!

В следующий раз будет самостоятельная работа в RStudio!!!

Нужны ноутбуки!

R и RStudio позволяют

  • оптимально организовать пространство для работы

  • создавать и отлаживать программные сценарии

  • удобно просматривать результаты работы

  • получать справочную информацию

  • работа с данными практически в любых форматах (импорт/экспорт)

Демонстрация

  • Устройство RStudio

  • Организация проектов

  • Создание файлов (.R, .Rmd)

  • Получение справочной информации

RStudio - общий вид 🏠

Программные сценарии

  • Первый шаг к воспроизводимости

  • Можно вводить команды по одной в консоль и выполнять их

  • Все действия будут отражены в вкладке History

  • Как понять, какие команды нам подошли, а какие выдали ошибку или неудовлетворительный результат?

Программные сценарии

  • Лучше сохранять только корректно работающие строки кода в нужной последовательности в файл

  • Нужно добавлять комментарии

  • Вы никогда не забудете, что и как вы делали

  • Получившийся файл всегда можно просмотреть и перезапустить, в том числе с другими параметрами и входными данными

  • Сохраняйте коды домашних заданий, контрольных и самостоятельных работ, проекта до получения зачета

file.R 🏠

File -> New File -> R Script

  • Код + комментарии

  • Можно использовать в RStudio или запускать из коммандной строки

  • Ctrl + enter - запуск строки кода или выделенного фрагмента кода

“Горячие” клавиши

file.Rmd 🏠

Создание отчета

Можно добавлять

  • форматированный текст

  • формулы

  • таблицы

  • код

  • результат выполнения кода

  • картинки

  • ссылки

file.Rmd

Создание

Способ раз:

File -> New File -> Markdown File -> создать “шапку” -> написать что-то осмысленное -> сохранить -> Knit -> .html/.pdf/.doc

Способ два:

File -> New File -> R Markdown -> шаблон файла с “шапкой” -> удалить лишнее и добавить нужное -> сохранить -> Knit -> .html/.pdf/.doc

Markdown

Markdown 🏠

  • Текстовый язык разметки

  • Позволяет объединять в одном отчете:

    • код

    • результат анализа данных (таблицы, рисунки, …)

    • комментарии

Markdown: блоки кода

Блок кода записывают в чанки (“chunk”):

  • Запускается целиком или по чанкам, сразу видны ошибки и проблемы

  • Переменные и функции, инициализированные в одном chunk, будут работать во всей сессии

Markdown 🏠

основные настройки

Устанавливаем TRUE или FALSE

{r echo = T}

  • echo - демонстрация кода

  • eval - выполнение кода

  • message и warnings - демонстрация предупреждений

Markdown: ошибки

В случае ошибки в коде итоговый документ не будет создан, появится сообщение об ошибке

Читаем ошибку - исправляем - перезапускаем

Markdown - почитать 🏠

Markdown в R

Markdown в R - reference

Оформление домашнего задания

Файлы

Называйте файлы согласно шаблону:

R2023_FBB_IvanovI_HW1.R

Указываем СВОЮ фамилию!!!

Обязательно должны быть файлы:

  • R2023_FBB_IvanovI_HW1.Rmd

  • R2023_FBB_IvanovI_HW1.html/.pdf

Внимательно читайте задание

Могут быть запрошены файлы другого типа

Оформление

Внутри файла с решением обязательно должно быть:

  • Название задания (Пр.: “ФББ - R - Домашнее задание №1”)

  • Имя и фамилия автора

  • Номер задания

  • Формулировка задания

  • Код, с помощью которого решено задание

  • Демонстрация корректности каждого шага решения задания

  • Комментарии (лучше, чтобы они были)

Используйте заголовки разного уровня, выделение текста (цветом, размером, толщиной, …)

Домашнее задание должно быть проверяемо без обращения к внешним источникам и без выполнения кода преподавателем

Оформление

По желанию добавляйте:

  • картинки

  • таблицы

  • ваши любые рассуждения и комментарии

  • ссылки

  • дополнительные решения

  • вопросы

Демонстрация решений

  1. Создайте вектор а из чисел 1, 5 и 8. Добавьте к каждому числу единицу. Положите результат в вектор b.

Хорошо:

a <- c(1, 5, 8) # создаем вектор
a
[1] 1 5 8
b <- a + 1 # прибавляем к значениям вектора а единицу
b
[1] 2 6 9

Плохо:

a <- c(1, 5, 8)
b <- a + 1

Вопрос

Задание: прочитайте таблицу, отберите из нее 1000 строк

Как продемонстрировать корректность вашего решения?

Не проверяем

  • неопознанные файлы: фамилия, номер и тип задания должны быть в названии файла И в “шапке” документа

  • неполное содержание файла:

    • нет номера домашнего задания

    • нет формулировок и номеров заданий

    • нет демонстрации решения (!!!)

  • решения, присланные после дедлайнов

Штрафы

  • за оформление: нет структуры файла (заголовки)

  • некорректная демонстрация решения

  • неверное или неполное решение

  • неоптимальное решение

Проверяйте, что итоговый файл сгенерился правильно и его можно прочитать

Списывание

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

Начисляются дополнительные штрафы

Самостоятельные работы и проект

  • Самостоятельные работы - короткие задания на пройденные темы, включая материал для самостоятельного изучения

  • Проект:

    • нужно поделиться на группы по 4 человека

    • каждой группе будет выдан набор данных

    • необходимо проанализировать данные и представить в виде презентации

    • защита проекта проходит в виде доклада на последнем занятии в семестре

Давайте уже R!

С чем мы работаем и где находимся?

getwd() # узнать рабочую директорию

setwd("path/to/Newdir") # задать рабочую директорию

dir() # список файлов в рабочей директории

dir.create("New_dir") # создать директорию New_dir

dir.exists("Dir") # проверить, существует ли директория Dir

unlink("Dir", recursive = T) # удалить директорию Dir

file.exists("file.txt") # проверить, существует ли файл file.txt

file.remove("file.txt") # удалить файл file.txt

sessionInfo() # информация о загруженной сессии R

Информация о загруженной сессии R

Знать версии программ и пакетов необходимо для возможности воспроизведения результатов

sessionInfo()
R version 4.2.2 (2022-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19045)

Matrix products: default

locale:
[1] LC_COLLATE=Russian_Russia.utf8  LC_CTYPE=Russian_Russia.utf8   
[3] LC_MONETARY=Russian_Russia.utf8 LC_NUMERIC=C                   
[5] LC_TIME=Russian_Russia.utf8    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] htmlwidgets_1.6.2 compiler_4.2.2    fastmap_1.1.1     cli_3.6.0        
 [5] tools_4.2.2       htmltools_0.5.6   rstudioapi_0.15.0 yaml_2.3.7       
 [9] rmarkdown_2.24    knitr_1.43        jsonlite_1.8.7    xfun_0.40        
[13] digest_0.6.33     rlang_1.1.1       evaluate_0.21    

Справки и помощь

  • ?seq
  • help(seq)
  • example(seq)

Cheat Sheets

Таблицы и вектора

Таблица

Вектор

Основной тип данных

Индексация начинается с 1!!!

Работа с векторами

x <- 1:5 
x 
[1] 1 2 3 4 5
length(x)
[1] 5
3 # это тоже вектор длины 1
[1] 3
z <- c("a", "b", "d") # тоже вектор, только строковый
z 
[1] "a" "b" "d"

Внимание!

При перезаписывании содержимого переменной никаких предупреждений не будет

x <- 2 
x
[1] 2
x <- 5 
x
[1] 5

Будьте внимательны при выборе имен для переменных

Индексация 🏠

Индексация элементов в R начинается с 1 (не с 0)

x <- 15:50 
x 
 [1] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
[26] 40 41 42 43 44 45 46 47 48 49 50

Способы создания вектора

Функция с() 🏠

c(1, 2, 3)
[1] 1 2 3

Объединение 🏠

x <- 1:3
x
[1] 1 2 3
x <- c(x, 5:7)
x
[1] 1 2 3 5 6 7

Последовательности 🏠

1:10
 [1]  1  2  3  4  5  6  7  8  9 10
5:-3
[1]  5  4  3  2  1  0 -1 -2 -3
seq(from = 1, to = 8, by = 2)
[1] 1 3 5 7

Повторы 🏠

rep(1:3, times = 3)
[1] 1 2 3 1 2 3 1 2 3
rep(1:3, each = 3)
[1] 1 1 1 2 2 2 3 3 3
rep(1:3, length.out = 8)
[1] 1 2 3 1 2 3 1 2

Взять 10 случайных чисел 🏠

от 1 до 30

sample(1:30, 10, replace = T)
 [1] 13  8  8  2 23  2  5 23 23 17
sample(1:30, 10, replace = T)
 [1] 25  8  6 11  1 25 25 26 20  6
set.seed(123)
sample(1:30, 10, replace = T)
 [1] 15 19 14  3 10 18 22 11  5 20
set.seed(123)
sample(1:30, 10, replace = T)
 [1] 15 19 14  3 10 18 22 11  5 20

set.seed(), sample() 🏠

Получить числа из известного распределения 🏠

  • rnorm(n, mean, sd) - нормальное распределение
  • runif(n, min, max) - равномерное распределение
  • rbinom(n, size, prob) - биномиальное распределение
  • rpois(n, lambda) - распределение Пуассона
set.seed(123)
rpois(20,10)
 [1]  8  9 14 10 10 15 11  5  4 13 11 11 10  8 15 11  3  7  6  8

Немного о функциях

Разберем функцию rnorm

В вкладке “Help” можно вызвать справочную информацию о функции

rnorm(n, mean = 0, sd = 1)

У функции есть параметры с значениями по умолчанию

set.seed(123)
rnorm(3) # получим 3 случайных значения из стандартного нормального распределения
[1] -0.5604756 -0.2301775  1.5587083

Немного о функциях

set.seed(123)
rnorm(3, mean = 1, sd = 2) # указываем значения параметров
[1] -0.1209513  0.5396450  4.1174166
set.seed(123)
rnorm(3, 1, 2) # чаще всего можно не указывать имена параметров в явном виде 
[1] -0.1209513  0.5396450  4.1174166

Вектор - данные одного типа 🏠

x <- c(0.5, 1.2, 3.6) # точка - разделитель разрядов
typeof(x) # double or numeric
[1] "double"
x <- c(5, 2, 3)
typeof(x) # double
[1] "double"
x <- 1:5
typeof(x) # integer  
[1] "integer"
x <- c(T,F,F,T) 
typeof(x) # logical  
[1] "logical"
x <- c('a','b','c')
typeof(x) # character 
[1] "character"

Таблица

Где тут вектора?

Приведение типов 🏠

x <- c(F, 1, 2, T)
typeof(x)
[1] "double"
x 
[1] 0 1 2 1
x <- c(1, 2.8)
typeof(x) 
[1] "double"
x 
[1] 1.0 2.8
x <- c(1, 'a', F, 5.5)
typeof(x) 
[1] "character"
x 
[1] "1"     "a"     "FALSE" "5.5"  

Преобразование типов 🏠

x <- c(F, F, T, T)
x
[1] FALSE FALSE  TRUE  TRUE
typeof(x)
[1] "logical"
x 
[1] FALSE FALSE  TRUE  TRUE
x <- as.numeric(x)
typeof(x) 
[1] "double"
x 
[1] 0 0 1 1

Имена элементов вектора

x <- 1:3 
x 
[1] 1 2 3
names(x)
NULL
names(x) <- c('a', 'b', 'c') 
x 
a b c 
1 2 3 
names(x) 
[1] "a" "b" "c"

Вектора 🏠

У каждого элемента вектора есть:

  • значение

  • индекс или порядковый номер

  • имя (может быть пустым)

Операции с векторами

x <- c(2, 7, 3, 1)
x + 4
[1]  6 11  7  5

Операции с векторами

x <- c(2, 7, 3, 1)
y <- c(3, 2, 5, 6)
x + y
[1] 5 9 8 7

Операции с векторами

x <- c(2, 7, 3, 1)
y <- c(3, 2)
x + y
[1] 5 9 6 3

Операции с векторами 🏠

x <- 1:5 
x 
[1] 1 2 3 4 5
x+3 
[1] 4 5 6 7 8
y <- 6:10 
y
[1]  6  7  8  9 10
x + y
[1]  7  9 11 13 15
x^2 
[1]  1  4  9 16 25
-x 
[1] -1 -2 -3 -4 -5

Операции с векторами 🏠

x <- 1:5 
x 
[1] 1 2 3 4 5
y <- 1:2 
y
[1] 1 2
x+y
Warning in x + y: длина большего объекта не является произведением длины
меньшего объекта
[1] 2 4 4 6 6

Операции с векторами

x <- 1:6 
x
[1] 1 2 3 4 5 6
x > 4
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE
x >= 4
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
x != 4
[1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
x == 4
[1] FALSE FALSE FALSE  TRUE FALSE FALSE

Получаем логический вектор той же длины!

Операции с векторами 🏠

replace(x, x == 2, 12) 
[1]  1 12  3  4  5  6
x %in% c(1, 4) 
[1]  TRUE FALSE FALSE  TRUE FALSE FALSE
x = 4 
x
[1] 4

Срезы: по индексам

x <- c(5, 16, 8, 32, 56, 2) 
x 
[1]  5 16  8 32 56  2
x[1]  # взять 1ый элемент 
[1] 5
x[2:4] # взять с 2го по 4ый элементы 
[1] 16  8 32
x[c(2, 5)] # взять 2ой и 5ый элементы 
[1] 16 56
x[-1] # без первого элемента 
[1] 16  8 32 56  2

Срезы: по индексам

x > 10  
[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE
x[x > 10] # отобрать элементы больше 10 
[1] 16 32 56
x[x >= 5 & x < 10] # отобрать элементы больше или равные 5 И меньше 10 
[1] 5 8
x[x >= 5 | x < 10] # отобрать элементы больше или равные 5 ИЛИ меньше 10 
[1]  5 16  8 32 56  2
x[2] <- 100 # заменить второй элемент вектора на 100

Срезы: по именам 🏠

x <- c(5,16,8,32,56,2) 
names(x) <- paste('v', 1:length(x), sep = '')
x 
v1 v2 v3 v4 v5 v6 
 5 16  8 32 56  2 
x['v3']  # взять элемент вектора х с именем v3 
v3 
 8 
x[c('v1', 'v3')] 
v1 v3 
 5  8 
x[c(1, 3)] 
v1 v3 
 5  8 

Полезные функции 🏠

x <- 1:6
y <- rep(7, 4)
x
[1] 1 2 3 4 5 6
y
[1] 7 7 7 7
any(x == 5)
[1] TRUE
any(x == 12)
[1] FALSE
all(x == 3)
[1] FALSE
all(y == 7)
[1] TRUE

Работа с переменными

Работа с переменными

ls() # список переменных из глобального окружения
rm(a, b) # удалить переменные a и b

rm(list=ls()) # удалить все переменные из глобального окружения

Названия переменных

НЕ должны:

  • начинаться с цифр

  • содержать пробелы

  • содержать специальные символы (+, -, /, , *, ^, …)

  • содержать зарезервированные слова (if, else, repeat, while, function, for, in, next, break, TRUE, FALSE, NULL, Inf, NaN, NA, …)

Data Frame

Кадры данных или данные табличного вида

Data frame

Создание

a <- c(5,4,8)
b <- c('a','b','c')
h <- c(T,F,T) 
g <- c(1.5,2.5,3.7) 
df <- data.frame(a,b,h)
df
  a b     h
1 5 a  TRUE
2 4 b FALSE
3 8 c  TRUE



df <- data.frame(a = c(5,4,8),
                 b = c('a','b','c'),
                 h = c(T,F,T),
                 g = c(1.5,2.5,3.7))
df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7

Data frame

Структура

df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7
str(df)
'data.frame':   3 obs. of  4 variables:
 $ a: num  5 4 8
 $ b: chr  "a" "b" "c"
 $ h: logi  TRUE FALSE TRUE
 $ g: num  1.5 2.5 3.7
dim(df)
[1] 3 4

Data frame 🏠

Строки и столбцы

df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7
colnames(df)
[1] "a" "b" "h" "g"
rownames(df)
[1] "1" "2" "3"

Data frame 🏠

Наполнение

df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7
head(df, 2)
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
tail(df, 3)
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7

Встроенные наборы данных

data()


?swiss

swiss

head(swiss,4)
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
Moutier           85.8        36.5          12         7    33.77
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
Moutier                  20.3
str(swiss)
'data.frame':   47 obs. of  6 variables:
 $ Fertility       : num  80.2 83.1 92.5 85.8 76.9 76.1 83.8 92.4 82.4 82.9 ...
 $ Agriculture     : num  17 45.1 39.7 36.5 43.5 35.3 70.2 67.8 53.3 45.2 ...
 $ Examination     : int  15 6 5 12 17 9 16 14 12 16 ...
 $ Education       : int  12 9 5 7 15 7 7 8 7 13 ...
 $ Catholic        : num  9.96 84.84 93.4 33.77 5.16 ...
 $ Infant.Mortality: num  22.2 22.2 20.2 20.3 20.6 26.6 23.6 24.9 21 24.4 ...

swiss

Обращение к столбцу

colnames(swiss)
[1] "Fertility"        "Agriculture"      "Examination"      "Education"       
[5] "Catholic"         "Infant.Mortality"
swiss$Education
 [1] 12  9  5  7 15  7  7  8  7 13  6 12  7 12  5  2  8 28 20  9 10  3 12  6  1
[26]  8  3 10 19  8  2  6  2  6  3  9  3 13 12 11 13 32  7  7 53 29 29
table(swiss$Education)

 1  2  3  5  6  7  8  9 10 11 12 13 15 19 20 28 29 32 53 
 1  3  4  2  4  7  4  3  2  1  5  3  1  1  1  1  2  1  1 

Data frame

Срезы

dim(swiss)
[1] 47  6
head(swiss,2)
           Fertility Agriculture Examination Education Catholic
Courtelary      80.2        17.0          15        12     9.96
Delemont        83.1        45.1           6         9    84.84
           Infant.Mortality
Courtelary             22.2
Delemont               22.2
swiss[3,6] 
[1] 20.2

Data frame 🏠

Срезы

swiss[8,]
      Fertility Agriculture Examination Education Catholic Infant.Mortality
Glane      92.4        67.8          14         8    97.16             24.9
swiss[1:3,]
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
swiss['Courtelary',c('Examination','Education')]
           Examination Education
Courtelary          15        12

Data frame

Выбор данных по условию

swiss[swiss$Fertility > 40 & swiss$Education < 8,]
             Fertility Agriculture Examination Education Catholic
Franches-Mnt      92.5        39.7           5         5    93.40
Moutier           85.8        36.5          12         7    33.77
Porrentruy        76.1        35.3           9         7    90.57
Broye             83.8        70.2          16         7    92.85
Gruyere           82.4        53.3          12         7    97.67
Veveyse           87.1        64.5          14         6    98.61
Aubonne           66.9        67.5          14         7     2.27
Cossonay          61.7        69.3          22         5     2.82
Echallens         68.3        72.6          18         2    24.20
Moudon            65.0        55.1          14         3     4.52
Orbe              57.4        54.1          20         6     4.20
Oron              72.5        71.2          12         1     2.40
Paysd'enhaut      72.0        63.5           6         3     2.56
Conthey           75.5        85.9           3         2    99.71
Entremont         69.3        84.9           7         6    99.68
Herens            77.3        89.7           5         2   100.00
Martigwy          70.5        78.2          12         6    98.96
Monthey           79.4        64.9           7         3    98.22
Sierre            92.2        84.6           3         3    99.46
Val de Ruz        77.6        37.6          15         7     4.97
ValdeTravers      67.6        18.7          25         7     8.65
             Infant.Mortality
Franches-Mnt             20.2
Moutier                  20.3
Porrentruy               26.6
Broye                    23.6
Gruyere                  21.0
Veveyse                  24.5
Aubonne                  19.1
Cossonay                 18.7
Echallens                21.2
Moudon                   22.4
Orbe                     15.3
Oron                     21.0
Paysd'enhaut             18.0
Conthey                  15.1
Entremont                19.8
Herens                   18.3
Martigwy                 19.4
Monthey                  20.2
Sierre                   16.3
Val de Ruz               20.0
ValdeTravers             19.5

Data frame 🏠

Выбор данных по условию

table(swiss$Education)

 1  2  3  5  6  7  8  9 10 11 12 13 15 19 20 28 29 32 53 
 1  3  4  2  4  7  4  3  2  1  5  3  1  1  1  1  2  1  1 
vec <- c(12,15)
vec
[1] 12 15
mt <- swiss[swiss$Education %in% vec,]

Data frame 🏠

Выбор данных по условию

table(mt$Education)

12 15 
 5  1 
mt <- swiss[!(swiss$Education %in% vec),]
table(mt$Education)

 1  2  3  5  6  7  8  9 10 11 13 19 20 28 29 32 53 
 1  3  4  2  4  7  4  3  2  1  3  1  1  1  2  1  1 

which

swiss[1:3,1:3]
             Fertility Agriculture Examination
Courtelary        80.2        17.0          15
Delemont          83.1        45.1           6
Franches-Mnt      92.5        39.7           5
which(swiss$Examination == 6)
[1]  2 27
which(colnames(swiss) == 'Examination')
[1] 3
which.min(swiss$Examination)
[1] 31
which.max(swiss$Examination)
[1] 45

Матрицы

Что такое матрица?

x <- 1:6
dim(x)
NULL

Что такое матрица?

x <- c(20:31)
m <- matrix(x, nrow = 3)
colnames(m) <- c('a', 'b', 'c', 'd')
rownames(m) <- c(1, 2, 3)
dim(m) # 2 строки и 3 столбца
[1] 3 4

Матрицы

  • Внешне похожи на таблицу

  • Вектор с атрибутом dim

  • Все элементы одного типа

  • Математические операции работают быстрее

Способы создания матрицы 🏠

m1 <- matrix(1:6, nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
m2 <- matrix(1:6, nrow=2, ncol=3,byrow=T)
m2 
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
as.matrix(1:3) 
     [,1]
[1,]    1
[2,]    2
[3,]    3

Способы создания матрицы 🏠

v <- 1:6
dim(v) 
NULL
dim(v) = c(2,3) 
v 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
is.matrix(v)
[1] TRUE

Способы создания матрицы 🏠

a <- c(1,2,3)
b <- c(4,5,6) 
rbind(a,b) 
  [,1] [,2] [,3]
a    1    2    3
b    4    5    6
cbind(a,b) 
     a b
[1,] 1 4
[2,] 2 5
[3,] 3 6

Матрицы: cрезы 🏠

m1 <- matrix(1:6, nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
m1[2,3] # взять элемент на пересечении 2 строки и 3 столбца 
[1] 6
m1[2,] # взять вторую строку 
[1] 2 4 6
m1[,3] # взять третий столбец 
[1] 5 6
m1[,3, drop = F] # взять третий столбец в виде матрицы 
     [,1]
[1,]    5
[2,]    6

Матрицы: изменение значений 🏠

m1 <- matrix(1:6, nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
m1[2,3] = 9 
m1
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    9

Матрицы: создать пустую матрицу 🏠

m1 <- matrix(nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA

Матрицы 🏠

m1 <- matrix(1:6,nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
rownames(m1)
NULL
colnames(m1)
NULL
rownames(m1) = c('r1','r2')
colnames(m1) = c('c1','c2','c3') 
m1 
   c1 c2 c3
r1  1  3  5
r2  2  4  6

Имена строк и столбцов должны быть уникальными!

Работа с пропущенными данными

Данные о качестве воздуха

head(airquality)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
dim(airquality)
[1] 153   6
mean(airquality$Ozone)
[1] NA

В чем проблема?

Работа с отсутствующими данными

  • NA - пропущенное значение: is.na()
  • NaN - результат недопустимой арифметической операции: is.nan()
  • NULL - отсутствие субъекта: is.null()

Работа с отсутствующими данными

Не учитывать отсутствующие данные

mean(airquality$Ozone, na.rm = T)
[1] 42.12931

Работа с отсутствующими данными

Удалить строки с отсутствующими данными

Удаляется ВСЯ строка!

dim(airquality)
[1] 153   6
air <- na.omit(airquality)
dim(air)
[1] 111   6
mean(air$Ozone)
[1] 42.0991
mean(airquality$Ozone, na.rm = T)
[1] 42.12931

Работа с отсутствующими данными

air <- head(airquality,10)
is.na(air$Ozone)
 [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE
sum(is.na(air$Ozone))
[1] 2
which(is.na(air$Ozone))
[1]  5 10
anyNA(air$Ozone)
[1] TRUE

NaN

0/0
[1] NaN

Удаление столбцов

head(air,3)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
air$Ozone = NULL
head(air,3)
  Solar.R Wind Temp Month Day
1     190  7.4   67     5   1
2     118  8.0   72     5   2
3     149 12.6   74     5   3

Списки

Списки 🏠

Можно хранить данные разного типа

L <- list("A",c(1,2),30)
L
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

Списки 🏠

Можно хранить данные разного типа

L1 <- list(L,40)
L1
[[1]]
[[1]][[1]]
[1] "A"

[[1]][[2]]
[1] 1 2

[[1]][[3]]
[1] 30


[[2]]
[1] 40

Списки 🏠

Добавление нового элемента

L[[4]] <- 'new_element'
L
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

[[4]]
[1] "new_element"

Списки 🏠

Срезы

L
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

[[4]]
[1] "new_element"
L[3]
[[1]]
[1] 30
L[[3]]
[1] 30

Списки 🏠

L1
[[1]]
[[1]][[1]]
[1] "A"

[[1]][[2]]
[1] 1 2

[[1]][[3]]
[1] 30


[[2]]
[1] 40
L1[[1]]
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

Списки 🏠

L
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

[[4]]
[1] "new_element"
L1 [[1]]
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30
L1 [[1]] [[2]]
[1] 1 2

Списки 🏠

L <- list(10,20)
L
[[1]]
[1] 10

[[2]]
[1] 20
L$abc <- 123
L
[[1]]
[1] 10

[[2]]
[1] 20

$abc
[1] 123

Списки 🏠

names(L)
[1] ""    ""    "abc"
L[[3]]
[1] 123
L$abc
[1] 123
L[['abc']]
[1] 123

Конец!