Jan 23: Векторы

Запись занятия

Запись занятия 23 января:

Все записи организованы в плейлист


Векторы

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

R используется достаточно простая система автоматического преобразования атомарных типов по логике от “самого строгого к самому гибкому”, то есть по цепочке logical -> integer -> numeric -> complex -> character (тип raw не включается в эту систему). Такое преобразование позволяет использовать конструкции вида sum(5 == 5), потому что логический результат сравнения (TRUE) будет преобразован в целое числовое значение (1, так как TRUE преобразовывается в 1, а FALSE - в 0), и, следовательно, можно вычислить количество верных утверждений.

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

Примеры приведений типов:

c('a', 3.6, 'b', 5.1)
## [1] "a"   "3.6" "b"   "5.1"
c(TRUE, 3.6, 2)
## [1] 1.0 3.6 2.0
sum(TRUE, FALSE, TRUE)
## [1] 2


Выбор элемента вектора

Выбор элементов векторов указывается с помощью оператора [ по следующей схеме: x[<condition>]. Это читается как 'элементы вектора x, которые удовлетворяют условию <condition>'.

В качестве условия может быть указатель номера элемента в последовательности (индекс), так и какое-то логическое условие. При использовании оператора [ в <condition> может быть передан вектор значений (или логическое выражение, возвращающее вектор значений).


Выбор по номеру позиции

Простой вариант выбора определённых элементов последовательности — по номеру в последовательности (по индексу, индекс начинается с 1). Например, в последовательности 4, 3, 2 на третьем месте находится значение 2. В коде выбор третьего элемента этой последовательности выглядит вот так:

x <- c(4, 3, 2)
x[3]
## [1] 2

В список номеров последовательности также можно передавать не только единичное значение, но и вектор значений номеров последовательности, который мы хотим извлечь. Например:

x <- c(4, 3, 2, 1)
x[c(2, 4)]
## [1] 3 1


Выбор по значению

Также возможен выбор элементов вектора, которые удовлетворяют условию. Например, те, которые больше 10, или все, которые равны 3, или все чётные. Логика такого выделения следующая: каждый элемент последовательности сравнивается с условием, и если сравнение верное (5 == 5, TRUE), то этот элемент возвращается как подходящий под условие. Фактически метка TRUE здесь является указателем элемента, который надо вернуть, аналогично номеру позиции при выделении по номеру позиции.

Например:

# создаём вектор 8 случайных значений из массива от 1 до 10
x <- sample(1:10, 8)
x
## [1] 10  6  5  4  1  8  2  7
# сравниваем каждое значение с 5, смотрим результат сравнения
x_cond <- x > 5
x_cond
## [1]  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE
# делаем выбор по условию, с указанием вектора, удовлетворяет элемент условию или нет
x[x_cond]
## [1] 10  6  8  7
# аналогично, но без создания отдельного вектора
x[x > 5]
## [1] 10  6  8  7


Поиск по вхождению в массив

Нередко встречаются ситуации, когда необходимо выбрать значения вектора, которые присутствуют в другом векторе. Например, из списка группы студентов выбрать тех, кто указан в списке недопущенных к сессии. Для этого используется выражение x %in% y. Оператор %in% проверяет, встречается ли каждый элемент вектора х в векторе y. Как и в сравнении по условию, в результате получается логический вектор, который можно использовать для выделения элементов. Выделенные элементы можно записать в отдельный объект.

Например:

x <- c('aaa', 'abc', 'bgs', 'gtr', 'ant', 'cer')
y <- c('tue', 'bgs', 'mtw', 'cer', 'lka')

# сравниваем элементы списков
x %in% y
## [1] FALSE FALSE  TRUE FALSE FALSE  TRUE
# выделяем те элементы списка х, которые есть в у
x[x %in% y]
## [1] "bgs" "cer"
# записываем результат в отдельный объект
z <- x[x %in% y]
str(z)
##  chr [1:2] "bgs" "cer"


Домашнее задание

Создайте вектор vec <- sample(10, 8) и умножьте каждый элемент вектора на 2.

Из вектора vec выберите все элементы, значения которых больше либо равны 5.

Сравните каждый элемент вектора vec <- letters[1:5] с буквой c (равен или нет) и запишите в отдельный векторindices. Выведите indices на печать. Примените indices для выбора элементов вектора vec. Проинтерпретируйте результат.

Из вектора vec <- sample(100, 8) выберите максимальное значение (элемент с максимальным значением).

Из вектора month.name (уже есть в базовом R, не надо создавать) извлеките каждый третий элемент.

Решите на максимальное значение с помощью функции which.max(). Прочитайте справку по функции и найдите “подводный камень”, который потенциально может привести к ошибкам. Попробуйте представить ситуацию, когда может возникнуть такая ошибка (необязательно при работе с векторами, например, при работе с таблицами).