2.7. Векторы индексов; выбор и изменение подмножеств наборов данных
Подмножества элементов вектора могут быть выбраны путем добавления к имени вектора индексного вектора в квадратных скобках. Более широко у любого выражения, которое оценивает вектор, может быть подмножества его элементов, так же выбранных путем добавления индексного вектора в квадратных скобках сразу после выражения.
Такой индексный вектор может быть любым из четырех различных типов.
– Логический вектор. В этом случае индексный вектор рециклично приводится к той же самой длине как вектор, из которого должны быть выбраны элементы. Значение, соответствующее TRUE в индексном векторе, выбрано, и те, которые соответствуют FALSE, опущены. Например:
> y <-x [! is.na (x)]
создает (или воссоздает) объект y, который будет содержать не несуществующие (только существующие) значения x в том же самом порядке. Заметим, что, если у x есть отсутствующие значения, то y будет короче, чем x. Также:
> (x+1) [(! is.na (x)) & x> 0] -> z
создает объект z и помещает в него значение вектора x+1, для которого соответствующее значение в x и не пропущено и положительное.
– Вектор положительных целых величин. В этом случае значение в индексном векторе должно лежать в наборе {1, 2…, length (x)}. Соответствующие элементы вектора выбраны и связаны в этом порядке в результате. Индексный вектор может иметь любую длину, и результат имеет одинаковую длину с индексным вектором. Например, x [6] является шестой компонентой x и
> x [1:10]
выбирает первые 10 элементов x (предполагается, что length (x) не меньше, чем 10). Также:
> c («x», «y») [rep (c (1,2,2,1), times=4)]
(по общему признанию вещь маловероятная), производит символьный вектор длины 16, состоящий из «x», «y», «y», «x» повторенных четыре раза.
– Вектор отрицательных целых величин. Такой индексный вектор указывает значение, которое будет исключаться, а не включаться. Таким образом:
> y <– x [– (1:5)]
даст все у, кроме первых пяти значений.
– Вектор символьных строк. Эта возможность применяется там, где у объекта есть атрибут имен для идентификации его компонентов. В этом случае подвектор вектора имен может использоваться таким же образом в качестве положительных целых меток в пункте 2 далее выше:
> fruit <– c (5, 10, 1, 20)
> names (fruit) <– c («orange», «banana», «apple», «peach»)
> lunch <– fruit [c («apple», «orange»)]
Преимущество состоит в том, что алфавитно-цифровые имена часто легче запомнить, чем числовые индексы. Эта опция особенно полезна в соединении с фреймами данных, как увидим позже.
Также индексное выражение может появиться на приемном конце присвоения, когда операция присвоения выполняется только на этих элементах вектора. Выражение должно иметь вектор вида [index_vector], поскольку наличие произвольного выражения вместо векторного имени не имеет здесь большого смысла.
Присвоенный вектор должен соответствовать длине индексного вектора, и в случае логического индексируют вектор, у него должна снова быть та же самая длина как вектор, который он индексирует.
Например:
> x[is.na (x)] <– 0
заменяет пропущенные значения в х на нули и
> y [y <0] <– -y [y <0]
имеет такой же результат как:
> y <– abs (y)
2.8 Другие типы объектов
Векторы – самый важный тип объекта в R, но есть несколько других, которые определим более формально в последующих разделах.
– matrices (матрицы) или более широко arrays (массивы) – многомерные обобщения векторов. Фактически, они – векторы, которые могут быть индексированы двумя или больше индексами и будут напечатаны специальными способами. См. Главу 5 [Массивы и матрицы].
– factors (факторы) реализуют компактные способы обработки категорических данных.
– lists (список) – общая форма вектора, в котором различные элементы могут не иметь одинаковый тип, и являются часто самостоятельно векторами или списками. Списки предоставляют удобный путь к возврату результатов статистического вычисления. См. Раздел 6.1 [Списки].
– data frames (фреймы данных) – подобные матрице структуры, в которых столбцы могут иметь различные типы. Думайте о фреймах данных как о «матрице данных» с одной строкой на отдельное наблюдение, но с (возможно) и числовыми и категориальными переменными. Много экспериментов лучше всего описываются фреймами данных: обработки категоричны, но отклик является числовым. См. Раздел 6.3 [Фреймы данных].
– functions (функции) – самостоятельные объекты в R, которые можно сохранить в рабочей области проекта. Этим реализован простой и удобный способ расширения R. См. Главу 10 [Написание собственных функций].
3. Объекты, их режимы и атрибуты
3.1. Внутренние атрибуты: режим и длина
Рабочие сущности R технически известны как объекты. Примерами могут быть векторы с численными (реальными) или комплексными величинами, векторы с логическими значениями и векторы строк символов. Они известны как «атомарные» структуры, так как их компоненты имеют одинаковый тип или режим (mode), а именно, numeric, complex, logical, character и raw.
numeric режим – на самом деле смесь двух разных режимов, а именно, integer и double precision, как объяснено в руководстве.
У векторов должен быть одинаковый режим для всех значений. Таким образом, любой данный вектор должен быть однозначно или логическим, числовым, комплексным, символьным или строковым (logical, numeric, complex, character или raw). Единственное очевидное исключение к этому правилу – специальное «значение», обозначаемое как NA для отсутствующих значений, хотя реально есть несколько типов NA. Заметим, что вектор может быть пустым и иметь режим. Например, пустой вектор символьной строки обозначается как character (0) и пустой числовой вектор как numeric (0).
R также работает с объектами, называемыми списками (list), которые имеют тип список (list). Существуют упорядоченные последовательности объектов, которые индивидуально могут иметь любой тип. Списки (list) известны как «рекурсивные», а не атомарные структуры, так как их компоненты могут самостоятельно быть списками.
Другие рекурсивные структуры из этого типа – это функции и выражения (function и expression). Функции – это объекты, которые являются частью системы R наряду с аналогичными написанными пользователем функциями, которые в деталях обсуждаются позже. Выражения, как объекты, составляют самую сложную часть R, которая не будет обсуждаться в этом руководстве, кроме как косвенно при обсуждении формул (formulae), используемых при моделировании R.
Типом (mode) объекта обозначили основной тип его фундаментальных свойств. Это – особый случай «свойств» объекта. Другое свойство каждого объекта – своя длина. Можно использовать функции mode (object) и length (object), чтобы узнать тип и длину любой определенной структуры.
Заметим, однако, что length (object) не всегда содержит явную полезную информацию, например, когда object – функция.
Другие свойства объекта обычно получают посредством attributes (object), смотри Раздел 3.3 [Получение и установка атрибутов]. Из-за этого тип и длину также называют «внутренними атрибутами» объекта.
Например, если z – комплексный вектор длины 100, то в выражении mode (z) является символьной строкой «complex», и length (z) равна 100.
R обслуживает изменения типа практически везде, где это имеет смысл сделать, и иногда там, где этого не так. Например, с:
> z <-0:9
можно ввести
> digits <– as.character (z)