Jan 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
В список номеров последовательности также можно передавать не только единичное значение, но и вектор значений номеров последовательности, который мы хотим извлечь. Например:
## [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(). Прочитайте справку по функции и найдите “подводный камень”, который потенциально может привести к ошибкам. Попробуйте представить ситуацию, когда может возникнуть такая ошибка (необязательно при работе с векторами, например, при работе с таблицами).