Давайте посмотрим на самые простые вычисления в 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 из какого-нибудь файла 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 представляет собой набор значений одного типа (или только числа, или только текст). Вектор создаётся с помощью функции 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 страхует нас от неправильных действий - не даёт посчитать среднее значение пола, потому что пол - неколичественный показатель, и делать это бессмысленно.
Теперь давайте перейдём к практике.