- Понятие вектора в языке программирования R
- Создание векторов
- Способ 1 – с()
- Способ 2 – scan()
- Способ 3 – seq()
- Операции над векторами
- 3 Вектор
- 3.1 Понятие atomic вектора в R
- 3.2 Приведение типов
- 3.3 Векторизация
- 3.4 Ресайклинг
- 3.5 Индексирование векторов
- 3.6 Работа с логическими векторами
- 3.6.1 mean() и sum() для подсчета пропорций и количества TRUE
- 3.6.2 all() и any()
- 3.6.3 Превращение логических значений в индексы: which()
- 3.6.4 оператор %in% и match()
- 3.7 NA — пропущенные значения
- Введение в R: линейная алгебра
- Векторы
- Массивы и матрицы
- Векторы
- Присваивание векторов
- Генерация последовательностей
- Логические векторы
- Пропущенные значения
- Индексирование векторов
- Массивы и матрицы
- Массивы
- Индексирование массивов
- Индексирование матриц
- Внешнее произведение двух матриц
- Демонстрация всех возможных определителей одноразрядных матриц 2×2
- Обобщённое транспонирование массива
- Умножение матриц
- Линейные уравнения и инверсия
- Собственные значения и собственные векторы
- Сингулярное разложение и определители
- Выравнивание методом наименьших квадратов и QR-разложение
- Формирование блочных матриц
Видео:Indexing vectors (R)Скачать
Понятие вектора в языке программирования R
Любой объект, который содержит данные называется data structure – структурой данных .
Вектор – это набор чисел, как правило, небольших размеров. Это – самый простой тип структуры данных в R. Даже одно число представляет собой вектор длиной в один элемент.
Вектор – поименованный одномерный объект, содержащий набор однотипных элементов.
Видео:Векторы (часть 1). Основы программирования на RСкачать
Создание векторов
Способ 1 – с()
Для создания векторов небольшой длины используется функция конкатенации c() (от «concatenate» – объединять, связывать).
В качестве аргументов этой функции через запятую перечисляют объединяемые в вектор значения. Например, зададим вектор z со значениями 1.1, 9, 3.14:
Способ 2 – scan()
Применяется функция scan(), которая «считывает» последовательно вводимые с клавиатуры значения. При этом выполнение команды scan завершают введением пустой строки
Заметьте, что X – заглавная буква. Если использовать прописную (х), то программа выдаст ошибку либо величину x , которая была ранее определена в листинге кода.
Этот способ требует внимательного ввода значений с клавиатуры. В случае, если вы введете другое, нежели требуется, число, необходимо будет либо вводить все значения заново, либо воспользоваться специальными инструментами для корректировки.
Способ 3 – seq()
При необходимости использования набора последовательных чисел, например, от 1 до 7, можно воспользоваться функцией seq()
Более того, функция seq() может устанавливать последовательность числе с шагом приращения:
Видео:Введение в R. Урок 4. Векторы в RСкачать
Операции над векторами
Векторы можно комбинировать, чтобы получить новый вектор.
Векторы можно объединять в один, как показано ниже
Векторы могут участвовать в арифметических операциях:
Каждый элемент вектора с именем my.vector1 сначала умножается на 2, а после к каждому из них прибавляется 100.
Другими распространенными арифметическими операциями являются
Чтобы найти квадратный корень можно использовать функцию
sqrt() или ^(1/2) , или ^0.5
Найдем корень вектора my.vector1 , элементы которого умножены на 2 и увеличены на 12.
Обратите внимание, что, когда программа выводит на экран ответ, в квадратных скобках указывается порядковый номер в наборе элементов.
Осуществим операцию деления над векторами:
Как видно, числа из меньшего вектора (2-го слагаемого) были добавлены к первым двум числам большего вектора (1-го слагаемого), а потом – к оставшимся двум числам в нем. Таким образом реализуется метод “Recycling” .
Можно проверить, есть ли элементы вектора меньше или больше некоторого значения, например:
Вектор может быть текстовым (character)
Если вы хотите объединить элементы текстового вектора в одну строку, то воспользуйтесь paste() , в котором аргумент collapse указывает программе, что между элементами должен быть один пробел.
Текстовые векторы тоже комбинируются. Допускается включение в вектор отдельных элементов
paste() может объединять элементы множества текстовых векторов. В самом простом случае объединяются два текстовых вектора, длина которых равняется 1, при этом аргумент sep отвечает за символ, стоящий между объединенными элементами
Если объединять текстовый вектор с числовым, программа преобразует все значения в текстовые:
Чтобы проверить, что new.vect является текстовым применим mode()
Далее объединим числовой и текстовый векторы одинаковой длины
Для векторов разной длины срабатывает “Recycling”
Чтобы обратится к конкретному элементу необходимо указать имя вектора и индекс этого элемента в квадратных скобках:
Из примера выше видно, что 4-й элемент вектора y равен 6. Ниже показано, что можно брать конкретные элементы из векторов и производить над ними операции:
Вывод нескольких последовательных значений , например, 2-го, 3-го и 4-го элементов вектора y , выполняется следующим образом
Чтобы выбрать конкретные элементы вектора, необходимо выполнить команду
Если при выводе требуется исключить некоторые элементы, то в предыдущей команде надо поставить минус «-»
Поддерживается также вывод по критерию. Например, выберем все значения больше 3
Благодаря индексам можно вносить исправления в вектор. Так, второй элемент вектора должен быть равным 4
Сортировка элементов вектора по возрастанию или убыванию осуществляется с помощью sort() . При этом аргументом, отвечающим за порядок сортировки, выступает decreasing , что означает «по убыванию» или «убывающий».
Еще раз о создании векторов. Помимо числовых и текстовых можно создавать логические векторы
Функция class() также используется для проверки типа вектора, при этом обратите внимание на результаты
Функция sum() вычисляет сумму элементов вектора
mean() – вычисляет среднее значение элементов вектора
Стандартное отклонение – sd()
Peter Dalgaard (2008). ‘Introductory Statistics with R’. Second Edition, Springer Science e+Business Media, LLC. 363 p.
Видео:Convert Data Frame Column to Vector in R (3 Examples) | Extract Variable | $-Operator & pullСкачать
3 Вектор
Видео:How to create a Vector in RСкачать
3.1 Понятие atomic вектора в R
Если у вас не было линейной алгебры (или у вас с ней было все плохо), то просто запомните, что вектор (atomic vector или просто atomic) – это набор (столбик) чисел в определенном порядке.
Если вы привыкли из школьного курса физики считать вектора стрелочками, то не спешите возмущаться и паниковать. Представьте стрелочки как точки из нуля координат до какой-то точки на координатной плоскости, например, :
Вот последние два числа и будем считать вектором. Попытайтесь теперь мысленно стереть координатную плоскость и выбросить стрелочки из головы, оставив только последовательность чисел :
На самом деле, мы уже работали с векторами в R, но, возможно, вы об этом даже не догадывались. Дело в том, что в R нет как таковых скалярных (т.е. одиночных) значений, есть вектора длиной 1. Такие дела!
Чтобы создать вектор из нескольких значений, нужно воспользоваться функцией c() :
Одна из самых мерзких и раздражающих причин ошибок в коде – это использование с из кириллицы вместо c из латиницы. Видите разницу? И я не вижу. А R видит. И об этом сообщает:
Для создания числовых векторов есть удобный оператор : .
Этот оператор создает вектор от первого числа до второго с шагом 1. Вы не представляете, как часто эта штука нам пригодится… Если же нужно сделать вектор с другим шагом, то есть функция seq() :
Кроме того, можно задавать не шаг, а длину вектора. Тогда функция seq() сама посчитает шаг:
Другая функция – rep() – позволяет создавать вектора с повторяющимися значениями. Первый аргумент – значение, которое нужно повторять, а второй аргумент – сколько раз повторять.
И первый, и второй аргумент могут быть векторами!
Еще можно объединять вектора (что мы, по сути, и делали, просто с векторами длиной 1):
Очень многие функции в R работают именно с векторами. Например, функции sum() (считает сумму значений вектора) и mean() (считает среднее арифметическое всех значений в векторе):
Видео:How to Convert a Column of a Data Set into a Vector in R. [HD]Скачать
3.2 Приведение типов
Что будет, если вы объедините два вектора с значениями разных типов? Ошибка?
Мы уже обсуждали, что в обычных векторах (atomic векторах) может быть только один тип данных. В некоторых языках программирования при операции с данными разных типов мы бы получили ошибку. А вот в R при несовпадении типов произойдет попытка привести типы к “общему знаменателю,” то есть конвертировать данные в более “широкий” тип (а иногда – более “узкий” тип, если того требует функция).
FALSE превратился в 0 (а TRUE превратился бы в 1 ), чтобы оба значения можно было объединить в вектор. То же самое произошло бы в случае операций с векторами:
Это называется неявным приведением типов (implicit coercion).
Вот более сложный пример:
Здесь все значения были приведены сразу к строковому типу данных.
У R есть иерархия приведения типов:
Мы из этого списка еще многого не знаем, сейчас важно запомнить, что логические данные – TRUE и FALSE – превращаются в 0 и 1 соответственно, а 0 и 1 в строчки «0» и «1» .
Если Вы боитесь полагаться на приведение типов, то можете воспользоваться функциями as.нужныйтипданных для явного приведения типов (explicit coercion):
Можно превращать и обратно, например, строковые значения в числовые. Если среди числа встретится буква или другой неподходящий знак, то мы получим предупреждение NA – пропущенное значение (мы очень скоро научимся с ними работать).
Один из распространенных примеров использования неявного приведения типов – использования функций sum() и mean() для подсчета в логическом векторе количества и доли TRUE соответсвенно. Мы будем много раз пользоваться этим приемом в дальнейшем!
Видео:How to Make a Character Vector in R – DemonstrationСкачать
3.3 Векторизация
Все те арифметические операторы, что мы использовали ранее, можно использовать с векторами одинаковой длины:
Если применить операторы на двух векторах одинаковой длины, то мы получим результат поэлементного применения оператора к двум векторам. Это называется векторизацией (vectorization).
Если после какого-нибудь MATLAB Вы привыкли, что по умолчанию операторы работают по правилам линейной алгебры и m * n будет давать скалярное произведение (dot product), то снова нет. Для скалярного произведения нужно использовать операторы с % по краям:
Абсолютно так же и с операциями с матрицами в R, хотя про матрицы будет немного позже.
В принципе, большинство функций в R, которые работают с отдельными значениями, так же хорошо работают и с целыми векторами. Скажем, если вы хотите извлечь корень из нескольких чисел, то для этого не нужны никакие циклы (как это обычно делается во многих других языках программирования). Можно просто “скормить” вектор функции и получить результат применения функции к каждому элементу вектора:
Таких векторизованных функций в R очень много. Многие из них написаны на более низкоуровневых языках программирования (C, C++, FORTRAN), за счет чего использование таких функций приводит не только к более элегантному, лаконичному, но и к более быстрому коду.
Векторизация в R – это очень важная фишка, которая отличает этот язык программирования от многих других. Если вы уже имеете опыт программирования на другом языке, то вам во многих задачах захочется использовать циклы типа for и while 7.2. Не спешите этого делать! В очень многих случаях циклы можно заменить векторизацией. Тем не менее, векторизация – это не единственный способ избавить от циклов типа for и while 8.5.1.
Видео:Geospatial Data in R - Introduction to Vector DataСкачать
3.4 Ресайклинг
Допустим мы хотим совершить какую-нибудь операцию с двумя векторами. Как мы убедились, с этим обычно нет никаких проблем, если они совпадают по длине. А что если вектора не совпадают по длине? Ничего страшного! Здесь будет работать правило ресайклинга (правило переписывания, recycling rule). Это означает, что если мы делаем операцию на двух векторах разной длины, то если короткий вектор кратен по длине длинному, короткий вектор будет повторяться необходимое количество раз:
А что будет, если совершать операции с вектором и отдельным значением? Можно считать это частным случаем ресайклинга: короткий вектор длиной 1 будет повторятся столько раз, сколько нужно, чтобы он совпадал по длине с длинным:
Если же меньший вектор не кратен большему (например, один из них длиной 3, а другой длиной 4), то R посчитает результат, но выдаст предупреждение.
Проблема в том, что эти предупреждения могут в неожиданный момент стать причиной ошибок. Поэтому не стоит полагаться на ресайклинг некратных по длине векторов. А вот ресайклинг кратных по длине векторов – это очень удобная штука, которая используется очень часто.
Видео:How to extract from a vector, matrix, or dataframe in R StudioСкачать
3.5 Индексирование векторов
Итак, мы подошли к одному из самых сложных моментов. И одному из основных. От того, как хорошо вы научись с этим работать, зависит весь ваш дальнейший успех на R-поприще!
Речь пойдет об индексировании векторов. Задача, которую Вам придется решать каждые пять минут работы в R – как выбрать из вектора (или же списка, матрицы и датафрейма) какую-то его часть. Для этого используются квадратные скобочки [] (не круглые – они для функций!).
Самое простое – индексировать по номеру индекса, т.е. порядку значения в векторе.
Если вы знакомы с другими языками программирования (не MATLAB, там все так же) и уже научились думать, что индексация с 0 – это очень удобно и очень правильно (ну или просто свыклись с этим), то в R вам придется переучиться обратно. Здесь первый индекс – это 1, а последний равен длине вектора – ее можно узнать с помощью функции length() . С обоих сторон индексы берутся включительно.
С помощью индексирования можно не только вытаскивать имеющиеся значения в векторе, но и присваивать им новые:
Конечно, можно использовать целые векторы для индексирования:
Индексирование с минусом выдаст вам все значения вектора кроме выбранных:
Минус здесь “выключает” выбранные значения из вектора, а не означает отсчет с конца как в Python.
Более того, можно использовать логический вектор для индексирования. В этом случае нужен логический вектор такой же длины:
Логический вектор работает здесь как фильтр: пропускает только те значения, где на соответствующей позиции в логическом векторе для индексирования содержится TRUE , и не пропускает те значения, где на соответствующей позиции в логическом векторе для индексирования содержится FALSE .
Ну а если эти два вектора (исходный вектор и логический вектор индексов) не равны по длине, то тут будет снова работать правило ресайклинга!
Есть еще один способ индексирования векторов, но он несколько более редкий: индексирование по имени. Дело в том, что для значений векторов можно (но не обязательно) присваивать имена:
А еще можно “вытаскивать” имена из вектора с помощью функции names() и присваивать таким образом новые имена.
letters – это “зашитая” в R константа – вектор букв от a до z. Иногда это очень удобно! Кроме того, есть константа LETTERS – то же самое, но заглавными буквами. А еще в R есть названия месяцев на английском и числовая константа pi .
Вернемся к нашему вектору n и посчитаем его среднее с помощью функции mean() :
А как вытащить все значения, которые больше среднего?
Сначала получим логический вектор – какие значения больше среднего:
А теперь используем его для индексирования вектора n :
Можно все это сделать в одну строчку:
Предыдущая строчка отражает то, что мы будем постоянно делать в R: вычленять (subset) из данных отдельные куски на основании разных условий.
Видео:Introduction to Repeating Things in R: Using Vectorized FunctionsСкачать
3.6 Работа с логическими векторами
На работе с логическими векторами построено очень много удобных фишек, связанных со сравнением условий.
3.6.1 mean() и sum() для подсчета пропорций и количества TRUE
Уже знакомая нам функция sum() позволяет посчитать количество TRUE в логическом векторе. Например, можно удобно посчитать сколько раз значение «blue» встречается в векторе eyes :
Функцию mean() можно использовать для подсчета пропорций TRUE в логическом векторе.
Умножив на 100, мы получим долю выраженную в процентах:
3.6.2 all() и any()
Функция all() выдает TRUE только когда все значения логического вектора на входе равны TRUE :
Функция any() выдает TRUE когда есть хотя бы одно значение TRUE :
Вместе с оператором ! можно получить много дополнительных вариантов. Например, есть ли хотя бы один FALSE в векторе?
Все ли значения в векторе равны FALSE ?
3.6.3 Превращение логических значений в индексы: which()
Как вы уже знаете, и логические векторы, и числовые вектора с индексами могут использоваться для индексирования векторов. Иногда может понадобиться превратить логический вектор в вектор индексов. Для этого есть функция which()
3.6.4 оператор %in% и match()
Часто возникает такая задача: нужно проверить вектор на равенство с хотя бы одним значением из другого вектора. Например, мы хотим вычленить всех зеленоглазых и голубоглазых. Может возникнуть идея сделать так:
Перед нами самый страшный случай: результат похож на правильный, но не правильный! Попытайтесь самостоятельно понять почему этот ответ неверный и что произошло на самом деле.
А на самом деле мы просто сравнили два вектора, один из которых короче другого, следовательно, у нас сработало правило ресайклинга.
Как мы видим, это совсем не то, что нам нужно! В данной ситуации нам подойдет сравнение с двумя значениями вместе с логическим ИЛИ.
Однако это не очень удобно, особенно если значений больше 2. Тогда на помощь приходит оператор %in% , который выполняет именно то, что нам изначально нужно: выдает для каждого значения в векторе слева, есть ли это значение среди значений вектора справа.
Основное преимущество оператора %in% в его простоте и понятности. У оператора %in% есть старший брат, более сложный и более мощный. Функция match() работает похожим образом на %in% , но при совпадении значения в левом векторе с одним из значений в правом выдает индекс соответствующего значения вместо TRUE . Если же совпадений нет, то вместо FALSE функция match() выдает NA (что можно поменять параметром nomatch = ).
Зачем это может понадобиться? Во-первых, это способ соединить два набора данных (хотя для этого есть и более подходящие инструменты), во-вторых, так можно заменить все значения кроме выбранных заменить на NA .
Видео:R Tutorial Vectors and Factors in RСкачать
3.7 NA — пропущенные значения
В реальных данных у нас часто чего-то не хватает. Например, из-за технической ошибки или невнимательности не получилось записать какое-то измерение. Для обозначения пропущенных значений в R есть специальное значение NA (расшифровывается как Not Available — недоступное значение). NA – это не строка «NA» , не 0 , не пустая строка «» и не FALSE . NA – это NA . Большинство операций с векторами, содержащими NA будут выдавать NA :
Заметьте, даже сравнение NA c NA выдает NA . Это может прозвучать абсурдно: ну как же так, и то NA , и другое NA – это же одно и то же, они должны быть равны! Не совсем: NA – это отсутствие информации об объекте, неопределенность, неизвестная нам величина. Если мы не знаем двух значений (т.е. имеем два NA ), то это еще не значит, что они равны.
Иногда наличие NA в данных очень бесит:
Получается, что наличие NA “заражает” неопределенностью все последующие действия. Что же делать?
Наверное, надо сравнить вектор с NA и исключить этих пакостников. Давайте попробуем:
Ах да, мы ведь только что узнали, что даже сравнение NA c NA приводит к NA ! Сначала это может показаться нелогичным: ведь с обоих сторон NA , почему же тогда результат их сравнения – это тоже NA , а не TRUE ?
Дело в том, что сравнивая две неопределенности, вы не можете установить между ними знак равенства. Представим себе двух супергероев: Бэтмена и Спайдермена. Допустим, мы не знаем их рост:
Одинаковый ли у них рост?
Мы не знаем! Возможно, да, возможно, и нет. Поэтому у нас здесь остается неопределенность.
Так как же избавиться от NA в данных? Самый простой способ – это функция is.na() :
Результат выполнения is.na(n) выдает FALSE на тех позициях, где у нас числа (или другие значения), и TRUE там, где у нас NA . Чтобы вычленить из вектора n все значения кроме NA нам нужно, чтобы было наоборот: TRUE , если это не NA , FALSE , если это NA . Здесь нам понадобится логический оператор НЕ ! (мы его уже встречали – см. @ref(data_types)), который инвертирует логические значения:
Ура, мы можем считать среднее без NA !
Теперь Вы понимаете, зачем нужно отрицание ( ! )
Вообще, есть еще один из способов посчитать среднее, если есть NA . Для этого надо залезть в хэлп по функции mean():
В хэлпе мы найдем параметр na.rm = , который по умолчанию FALSE . Вы знаете, что нужно делать!
NA может появляться в векторах разных типов. На самом деле, NA — это специальное значение в логических векторах, тогда как в векторах других типов NA появляется как NA_integer_ , NA_real_ , NA_complex_ или NA_character_ , но R обычно сам все переводит в нужный формат и показывает как просто NA . Таким образом, NA в векторах разных типов – это разные NA , хотя на практике эта деталь обычно несущественна.
Видео:Vectors in R Programming (In Hindi) | R Data Structures | R Programming Tutorial for Beginners #19Скачать
Введение в R: линейная алгебра
Jul 7, 2020 · 8 min read
R — очень мощный язык, разработанный специально для анализа и визуализации данных и машинного обучения, что делает его обязательным к изучению для любого начинающего специалиста по данным.
R особенно удобен для линейной алгебры. Встроенные типы данных, такие как векторы и матрицы, хорошо сочетаются со встроенными функциями, такими как алгоритмы решения собственных значений и определителей, а также с возможностями динамического индексирования.
В этой вводной в статье про R рассмотрим следующие реализации линейной алгебры:
Видео:Vectors in R (Numeric, Logical, Character) | R Programming TutorialСкачать
Векторы
- присваивание векторов;
- векторные операции;
- генерирование последовательностей;
- логические векторы;
- пропущенные значения;
- индексирование векторов.
Видео:R3 - Векторы в R. Часть 1Скачать
Массивы и матрицы
- массивы;
- индексация массивов;
- индексация матриц;
- внешнее произведение двух матриц;
- демонстрация всех возможных определителей одноразрядных матриц 2×2;
- обобщённое транспонирование массива;
- умножение матриц;
- линейные уравнения и инверсия;
- собственные значения и собственные векторы;
- сингулярное разложение и определители;
- выравнивание методом наименьших квадратов и QR-разложение;
- формирование блочных матриц.
Видео:membuat objek skalar, vektor matriks menggunakan R StudioСкачать
Векторы
Видео:Vector en RСкачать
Присваивание векторов
R оперирует структурами данн ы х, самой простой из которых является числовой вектор — упорядоченный набор чисел. Чтобы создать вектор x с четырьмя элементами 1 , 2 , 3 и 4 , можно использовать объединяющую функцию c() .
Здесь используется оператор присваивания , указывающий на назначаемый объект. В большинстве случаев можно заменить на = .
Также можно использовать функцию assign() :
Оператор y присвоит вектор 1, 2, 3, 4, 0, 1, 2, 3, 4 переменной y .
Векторы можно свободно перемножать и дополнять константами:
Заметьте, что эта операция верна, даже когда x и y имеют разную длину. В данном случае R просто будет повторять x (иногда дробно), пока не достигнет длины y. Поскольку y равен 9 числам в длину, а x — 4, x повторится 2.25 раз пока не совпадёт с длиной y.
Можно использовать все арифметические операторы: + , — , * , / и ^ , а также log , exp , sin , cos , tan , sqrt и многие другие. max(x) и min(x) отображают наибольший и наименьший элементы вектора x , а length(x) — количество элементов x ; sum(x) выдаёт сумму всех элементов x , а prod(x) — их произведение.
mean(x) вычисляет выборочное среднее, var(x) возвращает выборочную дисперсию, sort(x) возвращает вектор того же размера, что и x, элементы в котором расположены в порядке возрастания.
Видео:Support Vector Regression in RСкачать
Генерация последовательностей
В R существует множество методов для генерации последовательностей чисел. 1:30 аналогичен c(1, 2, …, 29, 30) . Двоеточие имеет более высокий приоритет в выражении, поэтому 2*1:15 вернёт c(2, 4, …, 28, 30) , а не c(2, 3, …, 14, 15) .
30:1 используется для генерации последовательности в обратном направлении.
Для генерации последовательностей можно использовать и функцию seq() . seq(2,10) возвращает такой же вектор, что и 2:10 . В seq() , можно также указать длину шага: seq(1,2,by=0.5) возвращает c(1, 1.5, 2) .
Аналогичная функция rep() копирует объект различными способами. Например, rep(x, times=5) вернёт пять копий x впритык.
Видео:vectors in R-ProgrammingСкачать
Логические векторы
Логические значения в R — TRUE, FALSE и NA. Логические векторы задаются условиями. val 13 задаёт val в качестве вектора той же длины, что x , со значением TRUE , если условие выполняется, и FALSE , если нет.
Логические операторы в R: , , > , >= , == и != , означающие, соответственно, меньше чем, меньше чем или равно, больше чем, больше чем или равно, равно или не равно.
Видео:How to Convert a Character to Numeric in R | String Vector & Data Frame Column | as.numeric FunctionСкачать
Пропущенные значения
Функция is.na(x) возвращает логический вектор того же размера, что и x , со значение TRUE , если соответствующий элемент для x равен NA .
x == NA отличается от is.na(x) , поскольку NA является не значением, а маркером для недоступной величины.
Второй тип “пропущенного значения” создаётся численными вычислениями, например 0/0 . В этом случае значения NaN (не числа) рассматриваются как значения NA , то есть is.na(x) вернёт TRUE и для NA , и для NaN значений. is.nan(x) используется только для определения значений NaN .
Видео:Язык R для пользователей Excel #2: Структуры данных в RСкачать
Индексирование векторов
Первый вид индексации — через логический вектор. y устанавливает y значениям x , не равным NA или NaN .
(x+1)[(!is.na(x)) & x>0] -> z устанавливает z значениям x+1 , больше 0 и не являющимся Na или NaN .
Второй метод осуществляется с вектором положительных целых значений. В этом случае значения должны быть в наборе . Для формирования результата соответствующие элементы вектора выбираются и объединяются в этом порядке. Важно помнить, что, в отличие от других языков, в R первый индекс равен 1, а не 0.
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 устанавливает y всем значениям x , кроме первых пяти.
Наконец, вектор символьных строк может использоваться, когда у объекта есть атрибут name для идентификации его компонентов. Для можно задать имя каждому индексу вектора names(fruit) . Затем элементы можно вызывать по имени lunch .
Преимущество этого подхода в том, что иногда буквенно-цифровые имена запомнить легче, чем индексы.
Обратите внимание, что индексированное выражение может встречаться на принимающей стороне присвоения, где оно только для этих элементов вектора. Например, x[is.na(x)] заменяет все значения NA и NaN в векторе x на 0 .
Другой пример: y[y аналогичен y — код просто заменяет все значения меньше 0 на отрицательные значения.
Массивы и матрицы
Массивы
Массив — это проиндексированный набор записей данных, не обязательно численный.
Вектор размерности — это вектор неотрицательных чисел. Если длина равна k, тогда массив k-размерный. Размерности индексируются от единицы вверх до значения, указанного вектором размерности.
Вектор может использоваться R в качестве массива, как атрибут dim . Если z — вектор из 1500 элементов, присвоение dim(z) означает, что z теперь представлен как массив 100 на 5 на 3.
Индексирование массивов
На индивидуальные элементы массива можно ссылаться, указав имя массива и в квадратных скобках индексы, разделённые запятыми.
Первое значение вектора a — 3 на 4 на 6 — может быть вызвано как a[1, 1, 1] , а последнее как a[3, 4, 6] .
a[,,] отображает массив полностью, следовательно, a[1,1,] берёт первую строку первого 2-размерного сечения a .
Индексирование матриц
Следующий код генерирует массив 4 на 5: x .
Массивы определяются вектором значений и размерностью матрицы. Значения вычисляются сначала сверху вниз, затем слева направо.
array(1:4, dim = c(2,2)) вернёт
В матрицах индексов запрещены отрицательные индексы, а значения NA и ноль разрешены.
Внешнее произведение двух матриц
Важной операцией с векторами является внешнее произведение. Если a и b — это два численных массива, их внешним произведением является массив, вектор размерности которого получается объединением двух векторов размерности, а вектор данных достигается формированием всех возможных произведений элементов вектора данных a и элементов вектора b . Внешнее произведение вычисляется с помощью оператора %o% :
Фактически любую функцию можно применить к двум массивам, используя внешнюю () функцию. Предположим, мы определили функцию f . Функцию можно применить к двум векторам x и y с помощью z .
Демонстрация всех возможных определителей одноразрядных матриц 2×2
Рассмотрим определители матриц 2 на 2 [a, b; c, d], где каждая запись представляет собой неотрицательное число от 0 до 9. Задача: найти определители всех возможных матриц этой формы и отобразить на графике высокой плотности частоту, с которой встречается значение.
Или, перефразируя, нужно найти распределение вероятности определителя, если каждая цифра выбирается независимо и равномерно случайным образом.
Один из умных способов сделать это — использовать внешнюю функцию дважды.
Первая строка присваивает d этой матрице:
Вторая строка снова использует внешнюю функцию для расчёта всех возможных определителей. Последняя строка строит график.
Обобщённое транспонирование массива
Функция aperm(a, perm) используется для перестановки массива a. Аргументом perm должна быть перестановка чисел <1,…, k>, где k — количество индексов в a. Результатом функции будет массив того же размера, что и a, но прежняя размерность, заданная perm[j] , становится новой размерностью j-th .
Проще понять, если думать об этом как об обобщённом транспонировании матриц. Если A — это матрица, тогда B — просто результат перестановки матрицы A :
В таких особых случаях перестановку осуществляет функция t() .
Умножение матриц
Для умножения матриц используется оператор %*% . Если A и B являются квадратными матрицами одинакового размера, A*B — это поэлементное произведение двух матриц. A %*% B — это скалярное произведение (произведение матриц).
Если x — вектор, тогда x %*% A %*% x — его квадратичная форма.
crossprod() осуществляет перекрёстные произведения. Таким образом crossprod(X, y) аналогична операции t(X) %*% y , но более эффективна.
diag(v) , где v — вектор — задаёт диагональную матрицу с элементами вектора в качестве диагональных элементов. diag(M) , где m — матрица — задаёт вектор основных диагональных элементов M (так же как и в Matlab). diag(k) , где k — единичное числовое значение — возвращает единичную матрицу k на k .
Линейные уравнения и инверсия
Решение линейных уравнений является инверсией умножения матриц. Если
с заданными только A и b , вектор x — решение системы линейных уравнений, которое быстро решается в R:
Собственные значения и собственные векторы
Функция eigen(Sm) вычисляет собственные значения и собственные векторы симметричной матрицы Sm. Результат — это список, где первый элемент отображает значения, а второй — векторы. ev присваивает этот список ev .
ev$val — это вектор собственных значений Sm , и ev$vec — матрица соответствующих собственных векторов.
Для больших матриц лучше избегать вычисления собственных векторов, если они не нужны, используя выражение:
Сингулярное разложение и определители
Функция svd(m) принимает произвольный матричный аргумент m и вычисляет его сингулярное разложение. Оно состоит из 1) матрицы ортонормированных столбцов U с тем же пространством столбцов, что и m , 2) второй матрицы ортонормированных столбцов V , пространство столбцов которой является пространством строк m , 3) и диагональной матрицы положительных элементов D :
det(m) используется для вычисления определителя квадратной матрицы m .
Выравнивание методом наименьших квадратов и QR-разложение
Функция lsfit() возвращает список заданных результатов процедуры выравнивания методом наименьших квадратов. Присваивание наподобие этого:
выдаёт результаты выравнивания методом наименьших квадратов, где y — это вектор наблюдений, а X — проектная матрица.
ls.diag() используется для диагностики регрессии.
Тесно связанной функцией является qr().
Они вычисляют ортогональную проекцию y на диапазон X в fit , проекцию на ортогональное дополнение в res и вектор коэффициентов для проекции в b .
Формирование блочных матриц
Матрицы можно строить из других векторов и матриц с помощью функций cbind() и rbind() .
cbind() формирует матрицы, связывая матрицы горизонтально (поколоночно), а rbind() связывает матрицы вертикально (построчно).
В присвоении X аргументами cbind() должны быть либо векторы любой длины, либо столбцы одинакового размера (одинаковым количеством строк).
rbind() выполняет соответствующую операцию для строк.