Векторы — сердце R

Главная структура данных R — вектор. Учимся создавать векторы и понимать векторные вычисления.

Вектор — упорядоченный набор значений одного типа, базовая единица данных в R.

В большинстве языков, чтобы сложить два списка чисел поэлементно, нужен цикл. В R этого почти никогда не требуется: операции автоматически применяются ко всем элементам вектора. Это и делает R таким удобным для данных — целую колонку таблицы можно обработать одной строкой кода, без явного перебора.

Почему это важно именно для анализа данных? Реальные наборы — это тысячи и миллионы значений: цены, температуры, отметки времени, баллы. Если бы каждое такое преобразование требовало цикла, код был бы длинным, медленным и полным ошибок. Векторное мышление — главная идея R: вы оперируете не отдельными числами, а целыми наборами сразу. Привыкнув к нему, вы начнёте писать короче и яснее.

Создание вектора функцией c()

Чтобы объединить несколько значений в вектор, используют функцию c (от combine — «объединить»):

ages <- c(25, 30, 22, 41)
ages

Вывод:

[1] 25 30 22 41

Теперь ages — вектор из четырёх чисел. Даже одиночное x <- 5 в R — это вектор длины 1, поэтому при выводе мы видели [1].

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

Самое мощное свойство — арифметика применяется поэлементно. Прибавим единицу ко всем возрастам сразу:

ages <- c(25, 30, 22, 41)
ages + 1

Вывод:

[1] 26 31 23 42

Никакого цикла не нужно — R сам прошёл по каждому элементу. Так же работают *, -, / и встроенные функции: sum(ages) вернёт сумму, length(ages) — количество элементов.

Как работает под капотом

Когда длины операндов разные, R применяет переработку (recycling): короткий вектор «повторяется» до длины длинного. Например, c(1, 2, 3, 4) + c(10, 20) даст 11 22 13 24 — короткий вектор c(10, 20) повторился. Если длинный вектор не делится нацело на короткий, R выдаст предупреждение, но результат всё равно посчитает. Это удобно (легко прибавить число ко всему вектору), но иногда становится источником скрытых ошибок.

Частые ошибки

  • Складывать векторы разной длины не подумав. Из-за recycling ошибка не всегда заметна — проверяйте length().
  • Забыть c(). Запись ages <- 25, 30, 22 — синтаксическая ошибка. Значения объединяет именно функция c().
  • Смешивать типы. Вектор хранит значения одного типа; об этом — следующий урок.

Итог

  • Вектор — упорядоченный набор значений одного типа.
  • Создаётся функцией c().
  • Арифметика применяется ко всем элементам сразу, без цикла.
  • При разной длине R повторяет короткий вектор (recycling).
Проверьте себя
1. Какая функция объединяет значения в вектор?
Av()
Bc()
Cvector()
Dlist()
2. Что вернёт c(1, 2, 3) + 10?
A[1] 16
B[1] 1 2 3 10
C[1] 11 12 13
DОшибку
3. Как называется механизм повторения короткого вектора до длины длинного?
Abroadcasting
Brecycling (переработка)
Cpadding
Dlooping