Bекторы

Вектор – список некоторых объектов. Создается он следующим образом:

x <- c(1, 0, 0, 2) # вектор x

Можем на него посмотреть:

x
## [1] 1 0 0 2

Для тех, кто знаком с Python: вектор – аналог списка (list) в Python, состоящего из элементов одного типа (элементы могут иметь разный тип, но тогда вектор будет уже немного не тот – увидим позже).

Определить тип вектора:

class(x)
## [1] "numeric"

И длину – число элементов в векторе:

length(x)
## [1] 4

С числовыми векторами в R мы можем осуществлять те же операции, что и с векторами в математике. Но результаты не всегда совпадают. Например, обычное умножение векторов с помощью знака * не соответствует ни скалярному, ни векторному произведению векторов. Это происходит потому, что арифметические операции с векторами выполняются поэлементно.

x <- c(1, 0, 0, 2) # вектор x
y <- c(0, 1, 1, 2) # вектор y

x + y # прибавляем к каждому элементу x элемент y
## [1] 1 1 1 4
x * y 
## [1] 0 0 0 4
3 * x - y
## [1]  3 -1 -1  4

Также мы можем «склеивать» векторы, то есть приписывать в конец одного вектора элементы другого:

result <- c(x, y) # склеиваем два вектора
result
## [1] 1 0 0 2 0 1 1 2

Кроме того, можно суммировать и сами элементы вектора:

x
## [1] 1 0 0 2
sum(x) # сумма всех элементов вектора
## [1] 3

Или находить их произведение:

prod(x)
## [1] 0

Или сортировать:

sort(x)
## [1] 0 0 1 2
sort(x, decreasing = TRUE) # по убыванию
## [1] 2 1 0 0

Возможны векторы и из нечисловых значений:

names <- c("Mary", "John", "Peter") 

Внимание: если в векторе встречаются как числовые значения, так и текстовые, то R будет воспринимать весь вектор как текстовый!

mix <- c(1, "Mary", 0, "Peter")
class(mix)
## [1] "character"

При работе с данными нужно всегда внимательно относиться к типу объектов. Например, если у нас есть результаты опроса студентов, и мы видим, что пять респондентов не указали свой возраст, не стоит кодировать эти пропущенные значения словом «нет». Лучше оставить значения пропущенными или закодировать их заведомо невозможным значением (например, 1000), чтобы потом ответы этиих респондентов спокойно отфильтровать. Социологи так обычно и поступают: ответы на вопросы кодируются небольшими числами (например, от 1 до 6, от 1 до 10), а пропущенные значения кодируются числами 98 или 99.

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

Как и у обычных переменных, у векторов можно изменять тип (тип всех элементов вектора). Например, можем преобразовать текстовый вектор в числовой с помощью функции as.numeric():

text <- c("2", "3", "5")
as.numeric(text)
## [1] 2 3 5

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

as.numeric(c("2.3", "6", "8"))
## [1] 2.3 6.0 8.0

Грустная новость: если бы в “2.3” разделителем являлась запятая, ничего бы не получилось – R в качестве разделителя разрядов признает только точку:

old <- c("2,3", "6", "8")
as.numeric(old)
## Warning: в результате преобразования созданы NA
## [1] NA  6  8

Что делать? В таком случае нужно сначала заменить запятую на точку с помощью gsub(), а уже потом преобразовывать:

new <- gsub(",", ".", old) # (что заменям, на что заменяем, где заменяем) 
as.numeric(new)
## [1] 2.3 6.0 8.0

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

Для того, чтобы выбрать элементы вектора по их индексу (положению в векторе), нужно учитывать, что в R нумерация начинается с 1, а не с 0, как в Python и многих языках программирования.

names <- c("Mary", "John", "Peter") 
names
## [1] "Mary"  "John"  "Peter"
names[1] # первый элемент вектора names
## [1] "Mary"
names[0] # не работает
## character(0)
names[1:2] # первые два элемента вектора names
## [1] "Mary" "John"

Если нужно выбрать элементы, которые следуют в векторе не подряд, индексы интересующих нас элементов нужно оформить в виде вектора:

names[c(1, 3)] # первый и третий
## [1] "Mary"  "Peter"
names[c(1:2, 2:3)] # срезы тоже можно перечислять в качестве элементов вектора
## [1] "Mary"  "John"  "John"  "Peter"

Обратите внимание: в отличие от Python, в R правый конец среза включается. Например, код names[1:2] вернёт первые два элемента, а не только элемент с индексом 1.

А теперь мы будем отбирать элементы вектора по их значению. Для этого необходимо указывать интересующие критерии выбора (условия) в квадратных скобках. Создадим вектор v:

v <- c(1, 8, 9, 2, 3, 0, -1)
v
## [1]  1  8  9  2  3  0 -1

Выберем элементы вектора v, которые больше 3:

v[v > 3] 
## [1] 8 9

Усложним задачу. Будем выбирать только четные элементы вектора v. Для этого нам понадобится оператор для определения остатка от деления: %%. Четные элементы – те, которые делятся на 2 без остатка. Значит, остаток от деления их на 2 должен быть равен нулю:

v[v%%2 == 0] # только четные элементы
## [1] 8 2 0

Условия можно сочетать:

v[v > 3 & v%%2 == 0] # четные элементы больше 3 
## [1] 8

Иногда нам нужно не найти элемент вектора по его номеру или по определенным критериям, а выполнить обратную задачу: вернуть индекс элемента (его порядковый номер в векторе). Это можно сделать так:

names
## [1] "Mary"  "John"  "Peter"
which(names =='Jane') # двойной знак =
## integer(0)

Можно также получать индексы элементов вектора, которые удовлетворяют определенным условиям:

v
## [1]  1  8  9  2  3  0 -1
which(v > 3)
## [1] 2 3
which(v%%2 == 0) # индексы четных чисел
## [1] 2 4 6

А как быть, если мы хотим изменить вектор? Например, добавить значение? Все просто:

p <- c(1, 2)
p[3] = 7 # добавим третий элемент
p
## [1] 1 2 7

Полезный факт: Индекс последнего элемента вектора в R совпадает с длиной вектора.

Если нужно удалить элемент, это делается так:

v[v != 8] # хотим убрать 8
## [1]  1  9  2  3  0 -1

Это работает и тогда, когда в векторе встречаются повторяющиеся значения – убираются все совпадающие элементы:

w <- c(6, 6, 6, 7)
w[w != 6]
## [1] 7