Занятие 1. Основы языка R

Язык R. Что это и почему

R — язык для обработки данных и работы с графикой, а также свободная программная среда с открытым исходным кодом в рамках проекта GNU.

Язык R обладает своеобразной логикой и структурой, которая многим из вас обязательно понравится. Несмотря на то, что в нем возможны обычные структуры, как и в большинстве других языков, R стремится максимально их упростить; например, в большинстве случаев он позволяет избежать циклов, что делает код очень компактным и наглядным. Сравните тут коды для решения одной и той же задачи на Python и R.

В R также хорошо развитая, отработанная графика для отражения самых разных особенностей и взаимосвязей данных.

Но за это: R не предназначен для создания самостоятельных программных средств. На нем вообще неудобно создавать интерактивные приложения. Он не подходит для разработки мобильных приложений или создания сайтов. Это язык строго для анализа данных. Зато эту задачу он делает хорошо и без лишней суеты.

Откуда его взять, этот R?

R — свободная и бесплатная среда. Загрузить установщик R для Windows, Linux и macOS можно тут: https://cran.r-project.org/

В принципе в нем уже можно работать, но не очень удобно. Обычно используют какую-то программную оболочку, чаще всего RStudio. Она тоже свободная и бесплатная для личного использования, и скачать ее для разных операционных систем можно тут: https://rstudio.com/products/rstudio/download/

Вначале установите R, затем уже RStudio.

Не перепутайте RStudio c R-Studio, платной утилитой для восстановления жестких дисков.

Но для этого, конечно, нужно иметь права администратора. В школе (а может, и дома) вы таких прав не имеете. Можно, конечно, установить portable-версии. Но есть вариант и получше: облачная RStudio.

Она находится тут: https://rstudio.cloud/ Зайдите на сайт, зарегистрируйтесь (для нашей совместной работы регистрируйтесь по вашему корпоративному Гугл-аккаунту. Вы попадете в раздел Your projects. Создайте там проект, например «Data Analysis» (увы, на кириллице названия не получаются) и можно работать.

Что нужно знать о языке R

Есть две важные вещи, которые нужно знать, потому что в других языках все по-другому:

  • Когда вы нажимаете «Выполнить» («Run» или Ctrl-Enter), то выполняется не весь написанный вами код, а только выделенный фрагмент; если ничего не выделено, то строка, на которой стоит курсор.

Да-да! С любыми данными мы можем работать поэтапно, по шагам, и смотреть, что получается.

  • После выполнения программы или ее части переменные не исчезают, их значение не стирается, а хранится в «окружении» («Enviroment»), пока вы эти переменные не удалите вручную или не выйдете из R (и то при этом можно все окружение сохранить!).

Это очень удобно, и позволяет нам при необходимости двигаться к цели небольшими шагами.

Базовые черты

Результаты команд выводятся в консоль («Console»), это такое окошко внизу слева. Команды можно вводить по одной прямо в консоль, но, конечно, удобнее записать в виде файла (скрипта), для этого выбирайте File — New file — R Script.

Команды, введенные в консоль, выполняются сразу после ввода и нажатия Enter. Команды, записанные в окно скрипта, выполнятся, если выделить соответствующие строки (или поставить курсор на строку) и нажать кнопку «Run» или Ctrl-Enter.

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

print(2+1)

Но в большинстве случаев можно не указывать print, а просто написать

2+1

Присвоение значения переменной производится с помощью знаков <- или ->. Все приведенные ниже строки идентичны (пробелы между элементами не имеют значения).

a<-10
a <- 10
10->a
10 -> a

В большинстве случаев для присвоения можно применять также знак равенства, как почти во всех других языках:

a = 10

Переменные объявляются динамически, то есть объявлять их заранее не нужно.

Векторы

Интересной чертой языка R является то, что в нем нет атомарных переменных. Все переменные, даже если в них записать всего одно значение, по умолчанию являются векторами, то есть в них можно записать целую цепочку значений, принадлежащих к одному типу.

a=10
a[2]=100
a[3]=1000
a

Последняя строка выведет значение a — 10 100 1000. Конечно, необязательно присваивать значения по одному, можно собрать их при помощи функции с (это латинская буква с):

c(10, 100, 1000)

Особые случаи векторов можно записать легче. Так, последовательность от 1 до 9 можно записать так:

1:9

А обратную — так:

9:1

Если нужно, чтобы последовательность была не с шагом 1, а, например, с шагом 2, можно использовать функцию seq

seq(1, 9, 2)

Если нужно записать несколько одинаковых значений, например, пять троек, то используют функцию rep

rep(3,5)

Все их можно комбинировать при помощи функции c

c(1, 5:10, rep(20,4))

Векторизованные вычисления

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

ves = c(1500, 500, 300)

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

for (i in 1:3){
   ves[i] = ves [i] / 1000
}

Но это ни к чему. В R достаточно разделить весь вектор на 1000, и он проделает эту операцию с каждым элементом.

ves = ves / 1000

Более того, можно складывать, вычитать, умножать и т. п. вектор на вектор. Например, у нас есть вектор с весами трех товаров в кг. и вектор с ценой каждого за килограмм. Перемножим их и узнаем, сколько нужно заплатить за каждый:

ves = c(1.5, 0.5, 0.3)
cena = c(350, 400, 150)
ves * cena

Если один из векторов-операторов короче другого, он «рециклируется», то есть вновь используется поэлементно, пока не достигнет длины длинного вектора. Попробуйте вот такой вариант:

1:8 * 1:2

Типы данных

Основные типы данных: числовые, текстовые, логические. Числовые записываются цифрами, десятичный разделитель — точка.

a = 3
b = 12.365
v = c(1.5, 2.3, 0.5)

Текстовые записываются в кавычках — простых или двойных, все равно

a = "Москва"
b = 'Moscow'
v = c("утро", "день", "вечер")

Логические — в виде слов TRUE или FALSE (заглавными буквами). Можно сократить до T и F

a = TRUE
a = T
b = FALSE
b = F
v = c(TRUE, TRUE, FALSE)

«Странные числа»

В R есть несколько специальных значений, которые условно называют «странные числа».

NA

Первое из них — NA, что значит «Not Available» — «недоступно» или «неизвестно». При работе с наборами данными это довольно употребимый показатель, он означает, что значение данных неизвестно: его невозможно (или просто не удалось) получить. Предположим, что вы решили узнать у четырех одноклассников, сколько у каждого домашних животных. У Антона нет ни одного, у Василисы есть собака, у Глафиры 20 кошек, а Данила отказался отвечать (или его нет в школе, или он написал в анкете что-то такое, что вы не можете разобрать). Тогда массив будет такой:

pets = c(0, 1, 20, NA)

Любые операции с NA приведут к NA, например, NA+1 = NA. Это логично: если прибавить к неизвестно чему единицу, будет неизвестно что.

NA может быть любого типа, например:

winners = c('ЦСКА', 'Спартак', NA, 'Зенит')

NaN

Похоже по названию, но не по сути. NaN значит «Not a Number» — «не число». Это значение говорит, что результат должен быть числом, но вещественным числом не является. Такой вариант появляется, например, если попробовать вычислить квадратный корень из отрицательного числа:

sqrt(-2)

Хочу заметить, что вы все-таки можете в R работать с комплексными числами, только нужно выделить в числе мнимую часть. В вышеприведенном случае это будет выглядеть так (при этом результат не будет NaN)

sqrt( -2 + 0i )

Inf, -Inf

Бесконечность и минус бесконечность. Получаются, соответственно, если положительное или отрицательное число разделить на 0:

1/0
-1/0

Если любое вещественное число разделить на бесконечность, будет 0

NULL

«Ничто». Если присвоить «ничто» переменной, она создается, но в нее ничего не записывается. Если использовать «ничто» в качестве элемента вектора, он просто игнорируется. Например, две ниже приведенные строки дают один результат:

с( 1, 3, NULL, 7, NULL, 11 )
c( 1, 3, 7, 11 )

Зачем нужен этот NULL, мы еще разберемся.

Читайте также: