Презентацию к лекции 12 Вы можете скачать здесь.
Типы данных в R: общий обзор
Все объекты в языке R делятся на несколько категорий. К примитивным типам относятся базовые векторы. Составные объекты включают списки, матрицы, массивы и таблицы данных (data frame). Отдельно выделяются специальные объекты языка, к которым относятся операторы, условные конструкции и циклы.
Существует также тип объект языка (language object). Он представляет собой выражение, записанное без вычисления его значения. Например, если записать выражение 1 > 2 и проверить его тип, это будет объект языка. Функции также являются примитивным типом и подразделяются на внутренние (встроенные) объекты и объекты байт-кода.
Примитивные векторы
Векторы могут быть разных типов. Рассмотрим основные из них.
Целочисленный тип (integer). Векторы этого типа создаются либо с помощью оператора двоеточия (например, 1:10), либо явным преобразованием через функцию as.integer().
Числа с плавающей точкой (double). Каждый элемент такого вектора занимает 8 байт памяти. Числа могут записываться как с десятичной точкой, так и без неё, либо создаваться явным приведением через as.double().
Комплексные числа (complex). Используются для специальных математических расчетов.
Строки (character). Последовательности символов.
Логические значения (logical). Принимают значения TRUE или FALSE.
Сырые данные (raw). Этот тип используется для хранения байтовой информации, загруженной извне. Преобразование выполняется функцией as.raw().
Особенности создания векторов
При формировании вектора функцией c() существует важная опция recursive. Она управляет поведением при включении списков внутрь вектора.
Если указать recursive = TRUE, то все элементы из вложенных списков будут извлечены и добавлены в общий вектор. Тип данных при этом может быть приведен к общему знаменателю.
Если recursive не указан (по умолчанию FALSE), то результатом объединения векторов и списков станет список, а не вектор. Тип объекта меняется, чтобы сохранить вложенную структуру.
Списки
Список (list) — это составной объект, который позволяет объединять данные разных типов и разной длины без потери их внутренней типизации.
Рассмотрим пример: у нас есть три вектора разной длины и разных типов. Мы можем объединить их в единый список. При выводе списка на экран мы увидим, что первый элемент списка содержит первый вектор, второй элемент — второй вектор и так далее.
Доступ к элементам списка имеет критически важную особенность, связанную с использованием скобок.
- Двойные квадратные скобки [[ ]] используются для извлечения конкретного элемента. Тип возвращаемого значения будет совпадать с типом самого элемента. Если элементом был числовой вектор, мы получим числовой вектор.
- Одинарные квадратные скобки [ ] возвращают подмножество списка. Эта операция не меняет тип контейнера: результатом всегда будет список, даже если мы запрашиваем всего один элемент.
Также можно обращаться к нескольким элементам, передав вектор индексов. Например, запрос первого и второго элемента вернет список, содержащий только их.
Массивы
Массив (array) — это многомерная структура данных. Он создается функцией array().
В качестве первого аргумента передаются сами данные в виде вектора, а в качестве второго — вектор размерности dim. Массивы не ограничены по количеству измерений.
При создании массива (например, матрицы 3 на 4) данные по умолчанию заполняются поколоночно. Это значит, что сначала заполняется первый столбец сверху вниз, затем второй и так далее.
Индексация массивов. Доступ к данным можно осуществлять разными способами:
- По индексу исходного вектора: Можно обратиться к элементу так, как будто массив — это плоский вектор. Например, запрос десятого элемента вернет значение из соответствующей позиции.
- По координатам: Если размерность массива равна N, можно указать индекс через N-1 запятую. Например, для двумерного массива запись [1, 2] вернет элемент из первой строки и второго столбца.
- Выбор строк и столбцов: Чтобы взять всю первую колонку, нужно записать [ , 1]. Чтобы взять всю первую строку — [1, ].
Индексация массивом. В R можно обращаться к элементам массива, используя матрицу индексов. Рассмотрим пример: у нас есть матрица X размером 2 на 2 со значениями 12 и 34. Создадим матрицу индексов i такого же размера, где указаны координаты: (2, 1) и (1, 2).
Если выполнить операцию X[i] <- 0, то значение 0 будет присвоено сначала элементу во второй строке и первом столбце, а затем элементу в первой строке и втором столбце. Это мощный инструмент для выборочного изменения данных.
Матрицы
Матрица (matrix) — это частный случай массива, который всегда имеет ровно два измерения.
Для создания матрицы используется функция matrix(). Ей передаются данные, количество строк (nrow) и количество столбцов (ncol). Важным параметром является byrow. Если установить byrow = TRUE, данные будут заполняться построчно, а не поколоночно (поведение по умолчанию).
Доступ к элементам матриц полностью аналогичен доступу к элементам двумерных массивов.
Таблицы данных (Data Frame)
Наиболее распространенным типом данных в R для анализа является таблица данных (data frame). Это структура, оптимизированная для применения статистических алгоритмов и моделей.
Объект создается функцией data.frame(). Внутри функции через запятую перечисляются векторы, которые станут колонками таблицы. При создании колонкам можно присвоить имена явно. Если имя не указано, R автоматически использует имя исходного объекта-вектора.
Важно отметить, что все векторы в таблице данных должны иметь одинаковую длину, но могут иметь разные типы.
В базовой комплектации R уже есть встроенные таблицы данных, которые удобно использовать для тестирования алгоритмов. Например, датасет mtcars содержит информацию о марках автомобилей и их технических характеристиках.
Краткие итоги
Освоение системы типов данных формирует фундаментальную базу для эффективного программирования на языке R. Понимание различий между примитивными векторами и составными структурами позволяет разработчику осознанно выбирать инструмент для хранения информации, избегая неявных ошибок преобразования и потери производительности. Ключевым аспектом является не просто запоминание синтаксиса, а понимание поведения объектов при выполнении операций.
Практическая ценность материала заключается в детальном разборе механики индексирования. Разница между возвращением самого элемента через двойные скобки и подмножества-контейнера через одинарные скобки — это классическая точка непонимания у новичков. Понимание этого механизма критически важно для написания чистого и предсказуемого кода при работе со списками. Аналогично, управление порядком заполнения матриц (поколоночно или построчно) напрямую влияет на корректность математических расчетов и визуализаций.
Отдельного внимания заслуживает концепция индексации массивов матрицей индексов. Этот подход выходит за рамки примитивного извлечения данных и позволяет выполнять сложные манипуляции с многомерными структурами, заменяя громоздкие циклы лаконичными векторными операциями. Это шаг в сторону идиоматичного использования R, ориентированного на обработку данных целиком, а не поэлементно.
Наконец, выделение таблиц данных (data frame) как основного контейнера для аналитики подчеркивает практическую направленность языка. Гибкость в сочетании разнородных колонок и наличие встроенных тестовых наборов данных позволяют быстро переходить от изучения теории к проверке гипотез и построению моделей. Таким образом, материал лекции связывает базовый синтаксис языка с прикладными задачами анализа данных, закладывая основу для дальнейшего изучения статистических методов и алгоритмов машинного обучения в R.
Система типов R
Все объекты в R делятся на примитивные (векторы), составные (списки, массивы, матрицы, data frame) и специальные (операторы, циклы). Существуют также объекты языка, хранящие выражения без вычисления.
Векторы
Основные типы векторов:
- integer: создается оператором : или as.integer().
- double: числа с точкой или без, 8 байт на элемент, функция as.double().
- complex: комплексные числа.
- character: строки.
- logical: TRUE / FALSE.
- raw: байтовые данные, функция as.raw().
Важная особенность функции c(): параметр recursive.
- recursive = TRUE извлекает элементы из списков и создает плоский вектор.
- По умолчанию (FALSE), если внутри есть списки, результатом будет список.
Списки (list)
Списки хранят объекты разных типов и длины, сохраняя их типизацию.
Правила индексации:
- List[[1]] (двойные скобки) извлекает сам элемент. Тип значения — тип элемента.
- List[1] (одинарные скобки) возвращает подсписок. Тип значения — всегда list.
- List[c(1,2)] возвращает список из нескольких элементов.
Массивы (array)
Создаются функцией array(data, dim). Количество измерений не ограничено. Данные по умолчанию заполняются поколоночно.
Доступ к элементам массива:
- По порядковому номеру: arr[10].
- По координатам: arr[1, 2] (строка, столбец).
- Выбор всей строки/столбца: arr[1, ] или arr[ , 1].
- Индексация матрицей: Можно передать матрицу координат. Операция X[index_matrix] <- 0 изменит несколько элементов по указанным координатам за один раз.
Матрицы (matrix)
Это двумерный массив. Создается через matrix(data, nrow, ncol). Ключевой параметр: byrow.
- byrow = FALSE (по умолчанию): заполнение по колонкам.
- byrow = TRUE: заполнение по строкам.
Таблицы данных (Data Frame)
Основной формат для анализа данных. Создается функцией data.frame(). Представляет собой набор колонок (векторов) одинаковой длины, но потенциально разных типов. Имена колонок можно задавать явно или они берутся из имен векторов. В R встроены готовые датасеты (например, mtcars) для тестирования алгоритмов.
1. Типы данных в R делятся на примитивные (векторы) и составные (списки, массивы, data frame).
2. Векторы integer и double имеют разные способы создания и объем занимаемой памяти.
3. Тип raw предназначен для работы с сырыми байтами, полученными извне.
4. Параметр recursive в функции c() управляет превращением результата в список или вектор.
5. Списки позволяют хранить разнородные данные без потери их исходных типов.
6. Использование [[]] извлекает содержимое элемента списка, а [] возвращает новый список.
7. Массивы при создании по умолчанию заполняются данными поколоночно.
8. Индексация массива другим массивом позволяет модифицировать множество элементов по координатам одной командой.
9. Матрица — это двумерный массив, поведение заполнения которого меняется параметром byrow.
10. Data frame является стандартом для хранения табличных данных в анализе.
11. Колонки в data frame могут иметь разные типы, но одинаковую длину.
12. Встроенные датасеты (например, mtcars) служат полигоном для проверки алгоритмов.
1. Какие основные категории типов данных существуют в языке R?
2. В чем разница между типами integer и double с точки зрения памяти и записи литералов?
3. Для каких целей используется тип данных raw?
4. Как влияет параметр recursive на результат выполнения функции c()?
5. Почему при объединении векторов и списков без recursive = TRUE результатом становится список?
6. В чем разница между извлечением элемента через [[]] и [] при работе со списком?
7. По какому принципу заполняется массив при создании, если не указано иное?
8. Какой синтаксис используется для выбора целой строки или столбца из матрицы?
9. В чем преимущество использования матрицы индексов для доступа к элементам массива?
10. Как параметр byrow влияет на формирование матрицы из вектора данных?
11. Каким требованиям должны удовлетворять векторы при создании data frame?
12. Для чего в R полезно использовать встроенные наборы данных, такие как mtcars?