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