R как калькулятор

Давайте посмотрим на самые простые вычисления в R, чтобы немного к нему попривыкнуть. Сложим два числа:

2 + 4
## [1] 6

Примечание: R не чувствителен к пробелам (можно было записать просто 2+3), но их рекомендуется добавлять для читаемости и красоты кода.

Вычтем одно из другого:

5 - 9
## [1] -4

Выполним сразу несколько арифметических операций:

2 * 8 - 16 / 5
## [1] 12.8

Обратите внимание: в R в качестве десятичного разделителя используется точка, не запятая. Если число будет записано с запятой, R не поймёт, что мы имеем в виду и выдаст ошибку вида неожиданный ',' или unexpected ',.

# попробуйте
2,5

Возведём число в степень:

8 ^ 2 # возведение в квадрат
## [1] 64

Извлечём квадратный корень из числа:

sqrt(17)
## [1] 4.123106

Если мы хотим округлить результат, нам пригодится функция round():

round(12.6)
## [1] 13

По умолчанию эта функция округляет число до ближайшего целого (округление происходит по правилам арифметики), поэтому в примере выше мы получили число 13. Однако мы можем задать нужное число знаков после точки самостоятельно:

round(2.567, 2)  # 1 знак после .
## [1] 2.57

Переменные в R

Переменные в R можно рассматривать как некоторые хранилища, «контейнеры», в которых можно хранить различные объекты: числа, текст, наборы чисел, таблицы или даже наборы таблиц. Переменная в R – это не абстрактный программистский объект, это ключевая вещь, которая будет нужна нам для подготовки и анализа данных. Например, когда мы будем загружать данные в R из какого-нибудь файла Excel, мы сначала сохраним табличку в переменную, а потом будем к ней обращаться, чтобы извлекать нужную нам информацию.

Для простоты поработаем пока с числовыми переменными. Создадим переменную a, сохраним в неё число 2 и выведем результат на экран:

a <- 2
a
## [1] 2

Стрелочка <-, которую мы использовали для присваивания значения переменной, на самом деле состоит из знака «больше» и дефиса (пробела между ними не должно быть). Она используется в R для присваивания значений и означает «равно». Знак = тоже можно использовать для тех же целей, но он считается «не R-овским», и его лучше всячески избегать :)

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

a <- a + 2
a # обновили, сейчас в a 2 + 2 = 4
## [1] 4

Зачем это нужно? Представьте себе такую ситуацию: выгрузили мы табличку из файла в R и поняли, что со столбцом «пол», в котором указаны значения «муж» и «жен» нам работать неудобно. Мы хотим добавить в таблицу столбец из 0 и 1, где 0 отвечает за женский пол, а 1 – за мужской. Столбец создали, как теперь сохранить изменения? Перезаписать переменную, в которой хранится загруженная табличка, сказав R, что теперь обновлённая таблица должна называться старым именем.

Переменные в R также могут быть текстовыми. Текст всегда записывается в кавычках:

s <- "hello"
s 
## [1] "hello"

Нет никакой разницы, какие кавычки использовать, одинарные '' или двойные "". Единственное, что важно: тип открывающих и закрывающих кавычек должен совпадать. Другими словами, мы не можем написать что-то вроде такого: "hello'.

Примечание: R чувствителен к регистру, поэтому, например, переменные a и A - это разные вещи.

Векторы в R

Вектор в R представляет собой набор значений одного типа (или только числа, или только текст). Вектор создаётся с помощью функции c() следующим образом:

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

Функция c() «связывает» все элементы, перечисленные через запятую, в один список. Этот список значений можно рассматривать как столбец в табличке.

Мы можем посмотреть на этот вектор:

v
## [1] 0 1 1 0

Чтобы узнать тип вектора (по меньшей мере, числовой он или нет), мы можем использовать функцию class():

class(v) # numeric values, числовые
## [1] "numeric"

Создавать текстовые векторы в R тоже можно:

name <- c("Anna", "Elisabeth")
name
## [1] "Anna"      "Elisabeth"

Проверим тип:

class(name)
## [1] "character"

Помимо числового и текстового в R есть особый тип векторов - факторный. Он используется в тех случаях, когда нечисловые (качественные) значения кодируются числами. Другими словами, когда числа «ненастоящие», когда с ними нельзя работать как с числами в математике. Например, если мы вместо значений "Ж" и "М" в столбце Пол мы будем ставить 0 и 1, мы всё равно не сможем говорить, что 1 здесь больше 0, это какие-то наши условные обозначения, результат договорённости. Или, например, если мы будем кодировать любимый цвет респондента числами от 1 до 4 (красный, желтый, зелёный, синий), мы не сможем сравнивать эти числа и утверждать, что 4 в два раза больше 2, потому что это то же самое, что сравнивать слова «желтый» и «синий». Считать среднее значение по такому набору чисел тоже неправильно (даже если технически мы можем все числа сложить и поделить на их количество), потому что результат будет неинтерпретируемым. Ведь непонятно, что такое средний цвет, равный, к примеру, 2.5.

Чтобы R тоже понимал, что числа «ненастоящие» и не позволял с ними работать как с настоящими, нужно превратить вектор или столбец в таблице в факторный. Сделать это можно с помощью функции factor():

gender <- c(0, 0, 1, 0, 1)  # числовой
factor(gender)  # факторный
## [1] 0 0 1 0 1
## Levels: 0 1

Levels здесь - это уникальные значения в векторе, то есть просто "0" и "1". Теперь сравним числовой вектор gender и факторный fgender и убедимся, что R не позволит обращаться с последним как с числовым.

fgender <- factor(gender)

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

mean(gender)  # получилось
## [1] 0.4
mean(fgender)  # не получилось
## Warning in mean.default(fgender): argument is not numeric or logical:
## returning NA
## [1] NA

Не получилось! R возращает значение NA («пустое», пропущенное значение, от not a number) и пишет аргумент не является числовым или логическим: возвращаю NA или argument is not numeric or logical. Таким образом, R страхует нас от неправильных действий - не даёт посчитать среднее значение пола, потому что пол - неколичественный показатель, и делать это бессмысленно.

Теперь давайте перейдём к практике.