Манипуляции с векторами

Векторизованные операции

Задание 1

Умножьте каждый элемент вектора vec <- sample(10) на 2.

В R реализована векторизация - все элементы вектора обрабатываются сразу и нет необходимости пробегать циклом по каждому из них.

vec <- sample(10)
print(vec)
##  [1]  9  5  4  6  2  1  3  7  8 10
vec * 2
##  [1] 18 10  8 12  4  2  6 14 16 20

Задание 2

Вычислите корень из каждого элемента вектора vec. Округлите значения до второго знака.

round(sqrt(vec), 2)
##  [1] 3.00 2.24 2.00 2.45 1.41 1.00 1.73 2.65 2.83 3.16

Задание 3

Проверьте, больше ли каждый элемент вектора чем 5.

vec > 5
##  [1]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE

Задание 4

Перемножьте векторы vec1 <- 1:3 и vec2 <- 2:5.

vec1 <- 1:3
vec2 <- 3:5

vec1 * vec2
## [1]  3  8 15

Извлечение элементов по индексу

Задание 5

Из вектора month.name извлеките пятый элемент.

month.name[5]
## [1] "May"

Задание 6

Из вектора month.name извлеките все элементы кроме пятого.

month.name[-5]
##  [1] "January"   "February"  "March"     "April"     "June"      "July"     
##  [7] "August"    "September" "October"   "November"  "December"

Задание 7

Из вектора month.names извлеките первые три элемента

month.name[1:3]
## [1] "January"  "February" "March"

Задание 8

Из вектора month.name извлеките первый, пятый и последний элементы.

Для того, чтобы вызвать последний элемент, не указывая его напрямую, можно воспользоваться функцией вычисления длины вектора - длина вектора и будет номером последнего значения.

month.name[c(1, 5, length(month.name))]
## [1] "January"  "May"      "December"

Задание 9

Создайте вектор первых семи элементов вектора letters, перемешанных в случайном порядке. Примените к нему функцию order(). Проинтерпретируйте результат.

Функция order() возвращает вектор номеров элементов исходного вектора как если бы эти элементы были отсортированы. То есть, если в результате order() первое значение - 6, это значит, что в исходном векторе шестой элемент самый маленький, и при сортировке по возрастанию должен быть на первом месте. Аналогично, если после 6 в результате order() идет 2, это значит, что второе по возрастанию значение в исходном векторе стоит в нем на втором месте.

set.seed(1234)
vec <- sample(letters[1:7])
print(vec)
## [1] "d" "b" "e" "g" "c" "a" "f"
order(vec)
## [1] 6 2 5 1 3 7 4

Задание 10

Отсортируйте вектор vec с использованием order() и без использования sort()

vec[order(vec)]
## [1] "a" "b" "c" "d" "e" "f" "g"

Извлечение элементов по значению

Задание 11

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

vec <- letters[1:5]
indices <- vec == 'c'
print(indices)
## [1] FALSE FALSE  TRUE FALSE FALSE
vec[indices]
## [1] "c"

Если в индекс вектора передавать вектор логических значений, то будет возвращено то значение вектора, которому в индексе соответствует TRUE. В этой задаче в indices единственное TRUE - третьим значением вектора indices. Соответственно, если его передавать в индекс вектора vec, то будет извлечено только третье значение этого вектора. В данном случае, буква c.

Задание 12

Из вектора month.name извлеките каждый третий элемент.

Каждый третий элемент - это те элементы, значения которых делятся без остатка на 3. Соответственно, надо сравнить с нулем остаток от деления номеров элементов вектора month.name на 3 и полученный вектор использовать для извлечения элементов

indices <- 1:length(month.name) %% 3 == 0
print(indices)
##  [1] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
month.name[indices]
## [1] "March"     "June"      "September" "December"

Задание 13

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

vec <- sample(10, 8)
vec[vec >= 5]
## [1]  6  7 10  8  5

Задание 14

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

Задание можно решить двумя путями - вычислить максимум и сделать в индексе сравнение, либо же воспользоваться функцией which.max()

vec <- sample(100, 8)

# решение через сравеение
vec[vec == max(vec)]
## [1] 96
# решение с which.max()
vec[which.max(vec)]
## [1] 96

Задание 15

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

vec[c(which.max(vec), which.min(vec))]
## [1] 96  4

Задание 16

Проверьте, встречаются ли значения вектора x <- c(1, 3, 5, 6) в векторе y <- sample(10, 8).

x <- c(1, 3, 5, 6)
y <- sample(10, 8)

x %in% y
## [1] TRUE TRUE TRUE TRUE

Задание 17

Верните все элементы вектора x, которые встречаются в векторе y.

x[x %in% y]
## [1] 1 3 5 6

Задание 18

Верните все элементы вектора x, которые не встречаются в векторе y.

Нужно воспользоваться механизмом логического отрицания - оператором !, если его применить к вектору логических значений, то результатом будет вектор обратных значений. И уже этот вектор использовать для выбора значений.

x[!(x %in% y)]
## numeric(0)

Модификация элементов

Задание 19

Замените первый элемент вектора vec <- sample(100, 8) на 999.

vec <- sample(100, 8)
vec[1] <- 999
vec
## [1] 999  40  84  48   3  87  41  72

Задание 20

В векторе vec <- sample(100, 15) три случайных значения замените на 999.

vec <- sample(100, 15)
vec
##  [1] 32 42 43  2 79 54 49 56 51  6 94 90 57  8 26
vec[sample(length(vec), 3)] <- 999
vec
##  [1] 999  42  43   2  79  54  49 999  51   6 999  90  57   8  26