Типы данных r studio
Находит широкое применение в различных областях знаний для моделирования, статистического анализа и обработки данных.
Клавиатурные сокращения
- Ctrl + Shift + C - закомментировать/раскомментировать выделенный фрагмент кода.
- Ctrl + Enter - отправляет строку из текстового редактора в консоль, а если выделить несколько строк, то будет выполнен этот фрагмент кода.
- Tab или Ctrl + Space - нажмите после того как начали набирать название функции или переменной, и появится список автоподстановки. Это помогает печатать код быстро и с меньшим количеством ошибок.
Автоподстановка названий функций начинает работать как только вы ввели несколько первых букв названия функции. Вы можете вызвать ее раньше, если нажмете Tab или Ctrl + Space .
Как только вы полностью ввели название функции и скобки, RStudio автоматически ставит закрывающую скобку и показывает раздел справки Usage для этой функции.
Если вы нажмете Tab или Ctrl + Space , когда курсор находится внутри скобок, то вам покажут список аргументов этой функции с расшифровками их значений из раздела справки Arguments для этой функции.
R — модульная система, он состоит из пакетов. Некоторые пакеты уже установлены, другие придется устанавливать из внешнего репозитория.
Из центрального репозитория R CRAN пакеты можно установить при помощи функции install.packages() , указав имя пакета. Запустите RStudio (с правами администратора, если вы в Windows) и, для начала, установите пакеты ggplot2 и readxl — они нам сегодня понадобятся.
Остальные пакеты мы будем устанавливать по мере необходимости.
Пакеты единожды устанавливаются в локальную библиотеку, затем их нужно активировать для работы один раз за сеанс.
Очень часто (на самом деле, всегда) для работы с данными предустановленных библиотек – тех, которые были автоматически установлены вместе с R – бывает недостаточно. Поэтому необходимые библиотеки нужно устанавливать самостоятельно. Для этого используется функция install.packages() . Для примера установим библиотеку foreign .
Важно: название библиотеки нужно всегда указывать в кавычках. Если ввести название без кавычек, R не найдет библиотеку и выдаст ошибку (Error in install.packages : объект ‘foreign’ не найден).
Иногда при установке библиотек можно столкнуться с проблемой: R пишет, что не может сохранить установочные файлы, так как нет доступа к нужной папке. Это обычно возникает в случае, если мы работаем в учетной записи, которая не является учетной записью администратора. Например, на компьютере есть пользователь Administrator (с неограниченными правами, в том числе по установке программ) и Student (с ограничениями). Решить проблему можно следующим образом: закрыть RStudio, щелкнуть по значку RStudio правой клавишей и выбрать “Запуск от имени администратора”. После этого библиотеки должны устанавливаться нормально.
Для того чтобы использовать функционал установленной библиотеки, надо сначала к ней обратиться –иначе R не будет понимать, откуда брать запрашиваемые функции и писать “Ошибка: не могу найти функцию …”. Сделать это можно так:
Здесь уже можно вводить название библиотеки без кавычек.
Установка и запуск дополнительных пакетов
Удобный способ уставновки дополнительный пакетов через графический интерфейс RStudio. Важно отметить галочкой автоматическую уставновку зависимостей.
Установка пакета data.table :
Загрузка пакета в рабочую область осуществляется через функции
Использовать функции из установленных пакетов, без их загрузки в рабочую область можно используя следующий вызов:
Если необходимо использовать много различных функций, содержащихся в пакете, или происходит частое обращение к ним в ходе работы, то удобнее использовать первый вариант - загрузка всего пакета в рабочую область.
В случае же, если функция вызывается редко или существует конфликт имен (разные функции в разных пакетах имеют одинаковое название), то предпочтительным становится второй вариант вызова функций, при котором явно указывается какая функция и из какого пакета должна использоваться.
Манипуляции с данными
Индексы списков
Для извлечения определенных элементов списка можно использовать числовые, текстовые и логические индексы. Однако при индексации списков есть некоторые особенности.
Создадим произвольный именованый список из двух элементов.
Выберем первый элемент списка запросом показанным ниже.
Обратите внимание, что в результате мы получим новый список содержащий только один элемент. Проверим это
Выберем первый элемент списка используя другую функцию
В этом случае запрос вернул содержимое первого элемента списка - целочисленный вектор.
Это важная особенность, которую упускают начинающие.
Альтернативный вариант доступа к содержимому одного элемента списка по его имени возможен с использоваем специальной конструкции ($)
Это аналогично следующему вызову с использованием текстового индекса
Списки
Списки содержат упорядоченный набор элементов, каждый из которых может являться вектором, матрицей, массивом, списком и т.д.
Как правило в виде списков удобно хранить либо какие-то однотипные данные соответствующие разным итерациям, например, множество моделей. Или хранить разнородные данные, которые имеют смысловую связь, например, различные статистические характеристики отдельной модели.
Векторизация
В R действия выполняются поэлементно сразу над всем набором данных (будь то вектор, матрица, data.frame и т.д.). Векторные вычисления очень эффективны, поэтому всегда когда нужно совершить действия над элементами вектора (матрицы и т.д.) предпочтительнее использовать векторизацию, а не циклы.
Кстати оператор присваивания тоже является функцией, и присвоение можно выполнить в таком виде
Сложение двух векторов одинаковой длины происходит поэлементно
Как упоминалось, векторные вычисления могут производиться над любой структурой данных (вектор, матрица, data.frame и т.д.). Пусть у нас есть матрица
Умножим все ее элементы на 2, или возведем во вторую степень
Онлайн курсы
-
- “Программирование на языке R”, начало курса 2 июня 2014
Factors
Factor - представляет номинальную или ранговую шкалу. Используется для представления Y в классификационных моделях.
Простейшие функции для работы с графикой
Базовый пакет R имеет в своем составе много функций для визуализации данных. Остановимся только на некоторых, которые могут быть полезны при первом знакомстве с данными.
Функция hist - строит гистограмму распределения какой-либо величины. Может помочь составить первое впечатление о нормальности распределения данных. Применим эту функцию к свойству y .
Если стандартное отображение не устраивает, то можно его изменить, например, сделав интервалы меньше.
Во всех случаях очевидно, что распределение данных отличается от нормального. Чтобы проверить это можно воспользоваться следующими двумя функциями, которые строят график зависимости между квантилями нормального распределения и квантилями исследуемого набора значений y . Чем сильнее отличие распределения от прямой, тем больше отклонение распределения от нормального.
Для более подробного знакомства с возможностями базовых функций графического отображения рекомендую ознакомиться со следующими источниками:
Векторы и типы данных
Вектор может содержать данные только одного типа.
Какой класс будет иметь вектор?
Векторы
Загрузим файл sol_y1.RData и определим среднее значение растворимости в выборке, медианное значение, максимальное и минимальное значения.
Все приведенные функции векторизированы, поэтому расчет происходит очень быстро и эффективно.
Функция summary возвращает всю вышеприведенную статистику в виде одного вектора значений.
Помимо этих есть еще множество функций рассчета различных статистических характеристик.
Пакеты (библиотеки функций) в R
Установка новых пакетов возможна через консоль R командой install.packages либо через графический интерфейс.
Особенности векторизации
Если два вектора имеют различное количество элементов, то вектор меньшей длины будет повторяться столько раз чтобы соответствовать длине большего вектора.
Если длина большего вектора кратна длине меньшего вектора, такая операция будет произведена неявно, без уведомления пользоателя.
В случае если длины комбинируемых векторов различны, то будет произведено циклическое совмещение элементов меньшего вектора относительно элементов большего вектора и будет сгенерировано предупреждение.
Имена элементов векторов, матриц, data.frames, списков и т.д.
Все объекты поддерживают присвоение имен содержащимся в них элементам.
Обычный и именованный вектор
Другой способ создания именованного вектора
Аналогично векторам матрицы и data.frames имеют такие свойства как rownames и colnames , которые позволяют изменять имена колонок и строк.
Удаление имен осуществляется присвоением специального типа NULL
Или для векторов
При этом к элементам уже нельзя будет обращаться по имени, а только по индексу.
Устройство RStudio
Окно редактора RStudio разделено на 4 области:
- код (зеленый прямоугольник на схеме) - это обычный текстовый редактор, в котором открывают и редактирут файлы с программами.
- консоль/RMarkdown (оранжевый прямоугольник на схеме). На вкладке консоль можно в живом режиме выполнять команды R, если вы не хотите их сохранять в виде программы.
- файлы/графики/пакеты/помощь/просмотр (желтый прямоугольник на схеме). На вкладке помощь можно просматривать файлы справки. На вкладке графики будут появляться графики. На вкладке файлы расположен файловый менеджер, который позволяет перемещаться по директориям вашего проекта и компьютера.
- среда/история (и еще может быть /Git, если ваш проект под контролем версий) (синий прямоугольник на схеме). На вкладке история есть список всех выполненных команд R. На вкладке среда расположен список объектов, находящихся в памяти.
Очистка рабочей области от загруженных и используемых переменных
Перед загрузкой данных, только что сохраненных в файл sol_x1.RData , сперва очистим рабочую область (удалим все загруженные переменные). Сделать это можно либо функцией rm . Приведенный вызов удалит все загруженные объекты.
Либо кликнув по кнопке Clear .
Объекты также можно удалять выборочно, указывая их названия.
Иногда при длительной работе и загрузке удалении больших объемом данных бывает полезно вызывать сборщик мусора, который принудительно очищает память от уже неиспользуемых данных.
Задания
- Создать функцию, которая будет считывать текстовый файл, содержащий дескрипторы, с использованием функции fread, и возвращать data.frame.
- Прочитать с использованием функции из п.1 и сохранить в бинарном формате файл sol_x2.txt .
- Прочитать файл sol_y1.txt , конвертировать загруженные данные в именованный вектор и сохранить его в бинарном формате. Создать для этого соответствующую функцию.
- Повторить операции п.3 для файла sol_y2.txt
Особенности индексов
Если идет обращение к несуществующему индексу, то вернется специальное значение NA
NA специальное значение указывающее, что значение не определено (Not Available).
Если присваивать значение элементу с несуществующим индексом, то этот элемент будет создан.
Другой пример в результате которого создаются NA
Для проверки является ли значение NA используется специальная функция
Все то же самое справедливо и для текстовых индексов
Аналогично для того, чтобы добавить новый элемент в список (колонку/строку в data.frame) используется новое имя или числовой индекс.
Пример с data.frame. Создадим data.frame и добавим новую переменную, которая будет равняться значению первой колонки во второй степени.
Пример со списком. Создадим именованый список из двух элементов и добавим к нему третий элемент.
R (R Core Team 2021) — это язык для статистического анализа и визуализации данных. Он возник как ответвление языка S/Splus, разработанного еще в 70-х годах в Bell Laboratories.
Росс Ихака (Ross Ihaka) и Роберт Джентльмен (Robert Gentleman), молодые ученые из университета Окленда, Новая Зеландия разработали R в 1993 году (Ihaka 1998) .
Сейчас Росс Ихака занимается статистикой в университете Окленда (Associate Professor). В 2010 году Ихака начал работать над новым языком с целью усовершенствовать R и улучшить его быстродействие (Ihaka 2010) .
Роберт Джентльмен работал как ученый и эксперт в нескольких компаниях биотехнологического и генетического профиля, и недавно стал вицепрезидентом компании 23andMe как эксперт в биоинформатике. Еще в 2001 году Роберт Джентльмен начал работать над проектом Bioconductor.
Другие способы ввода-вывода
Помимо текстовых и бинарных данных R может читать данные из различных баз данных, а также файлов MS Excel, для чего используется подключение дополнительных пакетов. В частности пакет xlsx позволяет работать с данными, сохраненными в одноименном формате.
Переменные в R
Названия переменных в R могут содержать буквы, цифры, точки и знаки подчеркивания, при этом название переменной не может начинаться с цифры. Название переменной не должно совпадать со служебными словами (операторами) в R: if , else , for , while и другимим.
Мы можем изменить значение переменной и сохранить ее под тем же именем:
R - язык функционального программирования
Функции производят операции над объектом и возвращают результат, при этом передаваемый объект не изменяется.
Если необходимо изменить состояние объекта, то результат функции присваивается переменной обозначающей этот объект.
Любая операция в R это функция
Создатели RStudio
RStudio (RStudio Team 2019) — это свободно распространяемая среда для разработки (integrated development environment) на языке R.
RStudio была основана в 2009 году американским программистом и интернет-предпринимателем Джозефом Аллером (Joseph J. Allaire). Среду RStudio можно устанавливать на компьютеры с разными операционными системами (Windows, OS X, and Linux).
Сейчас RStudio, пожалуй, самый удобный вариант среды для разработки на R. Мне кажется, что бум использования R в начале 10-х годов отчасти объясняется тем, что писать программы стало гораздо удобнее благодаря появлению среды RStudio.
К слову, вторая причина роста популярности R — это появление графического пакета ggplot2 (Wickham 2016) , написанного Хедли Викхемом (Hadley Wickham). Этот пакет во много раз облегчил построение сложных и красивых графиков. С тех пор Хедли Викхем написал еще много полезных пакетов и сейчас работает Chief Scientist в RStudio и Adjunct Professor в университете Окленда.
Для работы над этим курсом вам понадобится установить
Массивы
Массив - многомерный набор элементов одного типа.
Data.frames
Продемонстрируем работу с data.frames на примере.
Есть два набора соединений с рассчитанными дескрипторами и их необходимо объединить в один data.frame.
Загрузим оба имеющихся файла данных:
Проверим размерность загруженных данных. Функция dim возвращает размерность данных (число строк и число столбцов), другими словами число соединений и число дескрипторов.
Поскольку число дескрипторов отличается, то выясним какие дескрипторы отсутствуют в каждом из наборов данных.
Функция setdiff возвращает элементы первого вектора, которые отсутствуют во втором
var.names1 содержит имена дескрипторов, которые присутствуют в x1 и отсутствуют в x2 . Аналогично для var.names2 .
Посмотрим сколько таких дескриптров в каждом случае
Т.е. первый набор данных содержит 923 дескриптора, которые отсутствуют вов втором наборе, а второй - 383, которые отсутствуют в первом.
Поскольку мы используем фрагментные дескрипторы, то их отсутствие фактически означает, что число дескриторов данного вида равно нулю. Следовательно мы должны добавить отсутствующие дескрипторы в каждый набор данных и приравнять все их значения нулю.
Чтобы добавить нулевые значения этим дескрипторам мы вызываем их для соответствующего data.frame и присваиваем значение 0 .
Проверям размерность полученных данных
Число колонок (дескрипторов) теперь идентично. Проверим порядок следования дескриптров в каждом наборе, используя следующую конструкцию
Выражение в скобках возвращает вектор логических значений, который содержит TRUE в случае если на одинаковых позициях находятся одинаковые значения и FALSE в противном случае. Функция all возвращает TRUE , если все значения логического вектора равны TRUE .
Проверим действительно ли имена дескрипторов в обоих data.frames совпадают и мы ничего не упустили. Используем для этого функцию %in% , которая принимает два вектора, и если значение первого вектора присутствует во втором, то для этого элемента возвращается значение TRUE . Таким образом выражение записанное ниже можно прочитать как “все ли названия колонок первого набора данных присутствуют во втором наборе”
Аналогично выполняется проверка для второго набора
Две эти проверки можно заменить одной, если предварительно отсортировать имена колонок в обоих наборах почле чего сравнить их
Теперь перед объединением строк обоих data.frames необходимо расположить колонки в одинаковом порядке. Воспользуемся для этого свойством индексов и расположим колонки в x2 в той же последовательности что и в x1
Теперь колонки расположены в одной последовательности. Проверим
Полученные data.frames теперь можно объединить в один с использованием функции rbind - объединение данных по строкам (row bind).
Аналогично когда надо объединить данные по колонкам используется функция cbind .
Загрузим и объединим значения свойства для двух наборов данных
Посмотрим на распределение значений свойства
Tекстовые переменные (строки)
Что можно делать с текстовыми переменными? Например, в текстовых переменных можно заменять одни символы на другие. Для этого существует функция sub() .
Однако функция sub() позволяет изменить только первое совпадение. Для того, чтобы заменить все встречающиеся в тексте символы, нужно воспользоваться gsub() :
В базовом пакете base есть функция read.table , которая отвечает за чтение текстовых файлов. Она имеет множество параметров, что позволяет гибко управлять процессом чтения. Эта функция возвращает data.frame.
При написании команд и функций удобно пользоваться возможность автодополнения. Для этого наберите часть команды, или имени функции или параметра и нажмите сочетание клавиш Ctrl+Пробел. В выпадающем списке можно выбрать подходящую команду.
При написании путей к папкам и файлам можно использовать либо абсолютный либо относительный путь. Например, предыдущий вызов можно оформить как
Для представления пути используются либо символы слэша (/) либо удвоенные символы обратного слэша (\). Это обусловлено тем, что обратный слэш в R это спецсимвол и добавление второго слэша его экранирует и указываает R, что следующий за ним символ надо вопринимать как обычный.
Т.е. обе эти записи пути эквивалетны: "D:/Teaching/R/introduction/md/data/sol_y1.txt" или "D:\\Teaching\\R\\introduction\\md\\data\\sol_y1.txt"
Посмотрим на данные, которые были загружены. Сделать это можно несколькими способами, вот некоторые из них
Функция read.table является не очень эффективной с точки зрения производительности. Файлы, содержащие большое число столбцов считываются очень медленно. Если попробовать прочитать файл sol_x1.txt , который содержит 4058 дескрипторов для 800 соединений, то это займет заметное время.
Можете попробовать выполнить следующий код
Для преодоления этого недостатка есть несколько вариантов, вот два из них:
1. Использовать экспериментальную функцию fread из пакета data.table .
2. Конвертировать текстовые файлы в бинарный формат и в дальнейшем работать с этими файлами.
Основные достоинства:
Ресурсы в сети интернет для знакомства и освоения R
-
- двухминутные видео в стиле “how to …” - QuickR, описываются основные возможности языка
Формулы
Формулы - специальная форма выражения отношений между переменными в уравнении. Формулы используются при построении моделей для определения функциональной зависимости между параметрами.
Линейная комбинация (+):
Линейная комбинация с отсутствующим свободным членом (+0)
Функция идентичности I(), при этом выражение в скобках рассматривается как обычное математическое.
Формулы могут содержать математические функции
Символ точки (.) подставляет все имеющиеся переменные. Функция зависимости y от всех остальных переменных, которые будут передаваться в функцию выглядит так
Синтаксис | Модель | Пояснение |
---|---|---|
Y ~ A | \( Y = \beta_ + \beta_A \) | Уравнение регрессии с неявно заданным свободным членом |
Y ~ A + 0 | \( Y = \beta_A \) | Уравнение регрессии без свободного члена |
Y ~ A + B | \( Y = \beta_ + \beta_A + \beta_B \) | Уравнеие модели первого порядка |
Y ~ A + I(A^2) | \( Y = \beta_ + \beta_A + \beta_A^2 \) | Уравнеие модели второго порядка с одной переменной |
Y ~ A:B | \( Y = \beta_ + \beta_AB \) | Уравнение модели первого порядка, в которое входят только произведения переменных |
Y ~ A*B | \( Y = \beta_ + \beta_A + \beta_B + \beta_AB \) | Полное уравнение модели первого порядка, аналогично Y ~ A + B + A:B |
Y ~ (A + B + C)^2 | \( Y = \beta_ + \beta_A + \beta_B + \beta_C + \beta_AB + \beta_AC + \beta_BC \) | Модель первого порядка включающая все произведения до порядка n, аналогично Y ~ A*B*C - A:B:C |
Матрицы
Матрица - двумерный набор элементов одного типа (таблица).
Настройка
Все настройки RStudio находятся меню Tools -> Global Options
- Восстановление рабочено пространства из прошлого сеанса — это лучше отменить, т.к. обычно переменные-призраки очень мешают. На вкладке General убираем галочку Restore .RData into workspace at startup , и меняем Save workspace to .RData on exit - Never .
- Перенос длинных строк в окне кода — это удобно. На вкладке Code ставим галочку рядом с опцией Soft-wrap R source files .
Чтение данных в бинарном формате
Загрузим ранее сохраненный файл sol_x1.RData
Как вы могли заметить в списке загруженных переменных появилась новая с именем x1 как у ранее сохраненного data.frame.
Однако если в разных файлах сохранены объекты с одинаковым названием, то для их одновременной загрузки эти объекты необходио переименовать. Это можно во время загрузки данных, использовав следующий набор команд:
Проверим загруженный объект x1.1 на идентичность с x1
Сохранение данных в текстовом формате
Функция write.table сохраняет данные в текстовом формате. Она имеет много параметров для гибкой настройки вида сохраняемого файла.
Текстовые индексы
Текстовые индексы работают аналогично числовым
Выбор блока данных
Для текстовых индексов отсутствует возможность использования отрицательных значений индексов, т.е. чтобы удалить строку/колонку необходимо сформировать вектов с именами строк/колонок, которые необходимо оставить.
Организация рабочего пространства
- Создайте папку (например, Proteomics ), где будут храниться ВСЕ материалы курса. Например: Мы будем ее называть рабочей директорией. В эту папку помещайте ВСЕ файлы с кодом (с расширением .R).
- Внутри папки Proteomics создайте папку data , где будут храниться все файлы с данными для анализа.
В итоге у вас должно получиться примерно это:
R как калькулятор
Математические константы и функции:
Кто забыл про логарифмы: см. здесь.
Справка в R - прекрасный источник информации
Полное описание функций и возвращаемых ими значений с примерами можно найти в справке.
Дополнительно можно вызывать справку клавишей F1, когда курсор стоит на имени функции в тексте скрипта или в консоли.
Если необходимо найти какую-либо функцию по ее имени или части имени, то удобно пользоваться функциями из пакета sos .
Установите пакет sos и выполните следующие команды:
Другие функции для работы с текстовыми файлами
Существуют различные дополнительные функции для чтения и записи текстовых файлов с определенным стилем форматирования. Подробную информацию о них можно найти в справочной системе R.
Ориентирование на местности
Рано или поздно при работе в R у нас появится необходимость загружать или сохранять данные. Чтобы загрузить данные из какого-нибудь файла Excel, нам потребуется сообщить R, где этот файл находится, то есть прописать путь к файлу. Обычно путь выглядит достаточно громоздко, например, так: C:/User/Student/Документы/Мама-я-программист/данные.xls . Поэтому, скорее всего, мы захотим поступить проще – сообщить R, с какой папкой мы хотим работать, а затем просто указывать названия нужных файлов.
Папка, с которой работает R (откуда он запускается), называется рабочей. Узнать, какая папка является рабочей, можно так:
Если мы хотим изменить рабочую папку, то поступаем так:
Теперь R будет видеть, что файлы, которые мы собираемся открыть, лежат в указанной папке folder. И сохранять файлы он тоже будет в эту папку.
Индексация векторов, матриц, data.frames и т.д.
Индексация - исключительно эффективный и мощный инструмент для работы с данными.
Индексы могут быть:
- числовыми
- логическими
- текстовыми
Для индексирования используется три типа выражений:
- [ - выбирает элементы вектора/списка/массива и т.д.
- $ - выбирает один элемент из data.frame/списка по его имени.
- [[ - выбирает элементы из вектора/списка/массива и т.д, но отбрасывает имена, если они есть.
sapply & lapply
Помимо функции apply есть еще функции sapply и lapply , отличие которых состоит в том, что на вход они могут принимать вектор или список и возвращают вектор/матрицу ( sapply ) или список ( lapply ).
Вспомним, что data.frame является списком векторов-столбцов. Тогда предыдущий пример можно переписать как
Использование lapply вернет уже список
Возведем значения каждой колонки в степень, соответствующую номеру этой колонки - результатом будет новая матрица.
Обратите внимание, что в этом случае в качестве первого параметра передается не data.frame, а вектор индексов колонок, по которым происходит итерация.
Функция seq_along возвращает вектор индексов с первого до последнего элемента вектора/списка.
Использование функций семейства apply позволяет делать код более простым и читабельным.
Например, надо определить класс каждой колонки в data.frame
Как видим в отличие от apply фугкция sapply не производит неявной конвертации data.frame в матрицу и типы данных в колонках остаются неизменными.
Проверить совпадает ли порядок следования имен соединений в x и y .
Создать функцию, которая читала бы формат файлов дескрипторов dat/cds. Подсказка: можно использовать функцию readBin .
Создать функцию, которая будет объединять два набора фрагментных дескрипторов.
This article presents the different data types in R. To learn about the different variable types from a statistical point of view, read “Variable types and examples”.
There are the 6 most common data types in R:
- Numeric
- Integer
- Complex
- Character
- Factor
- Logical
Datasets in R are often a combination of these 6 different data types. Below we explore in more detail each data types one by one, except the data type “complex” as we focus on the main ones and this data type is rarely used in practice.
The most common data type in R is numeric. A variable or a series will be stored as numeric data if the values are numbers or if the values contains decimals. For example, the following two series are stored as numeric by default:
In other words, if you assign one or several numbers to an object in R, it will be stored as numeric by default (numbers with decimals), unless specified otherwise.
Integer data type is actually a special case of numeric data. Integers are numeric data without decimals. It can be used if you are sure that the numbers you store will never contains decimals. For example, let’s say you are interested in the number of children in a sample of 10 families. This variable is a discrete variable (see a reminder on the variable types if you do not remember what is a discrete variable) and will never have decimals. Therefore, it can be stored as integer data thanks to the as.integer() command:
Note that if your variable does not have decimals, R will automatically set the type as integers instead of numeric.
The data type character is used when storing text, known as strings in R. The simplest ways to store data under the character format is by using "" around the piece of text:
Note that everything inside "" will be considered as character, no matter if it looks like character or not. For example:
Furthermore, as soon as there is at least one character value inside a variable or vector, the whole variable or vector will be considered as character:
Last but not least, although space does not matter in numeric data, it does matter for character data:
As you can see from the results above, a space within character data (i.e., within "" ) makes it a different string in R!
Factor variables are a special case of character variables in the sense that it also contains text. However, factor variables are used when there are a limited number of unique character strings. It often represents a categorical variable. For instance, the gender will usually take on only two values, “female” or “male” (and will be considered as a factor variable) whereas the name will generally have lots of possibilities (and thus will be considered as a character variable). To create a factor variable use the factor() function:
To know the different levels of a factor variable, use levels() :
By default, the levels are sorted alphabetically. You can reorder the levels with the argument levels in the factor() function:
Character strings can be converted to factors with as.factor() :
The character strings have been transformed to factors, as shown by its class of the type factor .
A logical variable is a variable with only two values; TRUE or FALSE :
It is also possible to transform logical data into numeric data. After the transformation from logical to numeric with the as.numeric() command, FALSE values equal to 0 and TRUE values equal to 1:
Conversely, numeric data can be converted to logical data, with FALSE for all values equal to 0 and TRUE for all other values.
Thanks for reading. I hope this article helped you to understand the basic data types in R and their particularities. If you would like to learn more about the different variable types from a statistical point of view, read the article “Variable types and examples”.
As always, if you have a question or a suggestion related to the topic covered in this article, please add it as a comment so other readers can benefit from the discussion.
Способы создания векторов
Data.frames
Data.frame - двумерный набор данных (таблица). В отличие от матриц, колонки в data.frame могут содержать данные различного типа. Однако тип данных внутри каждой колонки может быть только один. Это объясняется тем, что data.frame это список векторов (колонок). Поэтому к data.frame могут быть применены различные функции применимые к спискам.
Семейство функций apply
Внешний вид RStudio
Важно! R является регистрозависимым языком, поэтому надо быть внимательным при написании имен команд и переменных. Переменные big_table и Big_table рассматриваются как разные.
Типы данных
Типы данных в порядке увеличения приоритета:
- Логические (logical)
- Целочисленные (integer)
- Вещественные числа (numeric)
- Комлексные числа (complex)
- Текстовые (character)
- Списки (list)
Числовые переменные
С числовыми переменными можно делать то же, что и с числами:
e здесь - это число 10. Запись 9.313226e+20 означает, что число \(9.313226\) надо умножить на \(10^\) . Если, напротив, R нужно было бы выдать очень маленькое число, 10 стояло бы в отрицательной степени:
Чтение текстовых файлов с использованием функции fread (пакет data.table)
Для просмотра загруженной таблицы в RStudio можно использовать команду
или кликнуть по имени переменной x1 в списке
Результат в обоих случаях будет одинаковым
Проверим объект какого класса получился при загрузке таблицы с использованием функции fread
Приведем объект x1 к типу data.frame
Отметим, что первая колонка содержит названия соединений. Переместим значения этой колонки в поле rownames
Проверим, что получилось.
Основные достоинства:
Создание пользовательских функций
Если часто используется одна и та же последовательность команд, то целесообразнее создать функцию, которая бы их выполняла автоматически. Это существенно упрощает текст программы, делает его более модульным, читабельным и простым для внесения изменений.
Создадим простейшую функцию рассчитывающую разность двух векторов
Важно отметить, что при передаче параметров в функции, можно не использовать названия параметров только в том случае, если соблюдается порядок следования параметров. В противном случае необходимо указывать названия параметров.
Продемонстрируем области видимости переменных на примере собственных функций.
Создадим вектор x и вызовем созданную нами функцию. Результат функции это измененный вектор x , однако сам вектор x не изменился.
Таким образом все что передается в функцию попадает в локальную области видимости только этой функции как и все изменения.
Реализуем собственную функцию загрузки бинарных файлов
Ключевое слово return в завершении функции писать не обязательно. По умолчанию функция возвращает результат последней операции.
Для того чтобы сохранить созданную функцию текст функции посещается в (новый) файл R script, который можно создать вызвав меню File - New file - R script или нажав комбинацию Ctrl + Shift + N. После чего пишется текст функции и файл сохраняется с расширением “.R”.
Для загрузки функции из файла используется функция source . Но предварительно очистим содержимое рабочей области.
После чего для загрузки бинарного файла достаточно вызвать
Ранее для чтения текстового файла с дескрипторами мы использовали следующий вызов.
Если часто использовать ее для чтения файлов, то удобнее создать собственную функцию. Создадим два варианта.
Первый вариант
Троеточие используется для передачи дополнительных параметров внутрь функций.
Тогда для загрузки файлов с дескрипторами достаточно вызвать
Какие достоинства и недостатки у каждого из вариантов?
Индексы data.frames
Выборка данных из data.frames была описана выше и ничем не отличается от других структур данных (вектров, матриц и т.д.). Единственная особенность вытекает из того, что data.frame это список векторов (колонок), то для выбора одной колонки по имени можно использовать конструкцию аналогичную для списков
Такое выражение всегда возвращает вектор.
apply
Семейство функций apply является более удобным аналогом цикла for .
Рассмотрим пример - необходимо найти среднее значение каждой колонки в data.frame.
Решение с использованием цикла for
Решение с использованием функции apply
Правда короче и проще? Кроме того вектор с результатами содержит названия переменных.
А вот выражение, которое вычисляет среднее значение по строкам
На самом деле для операции нахождения среднего и суммы по строкам/столбцам есть отдельные векторизированные функции rowMeans , rowSums и т.д.
Общий вид вызова функции apply
X - матрица, массив или data.frame
MARGIN - порядковый номер размерноси, к которой будет применяться функция FUN (1 для строк, 2 для колонок)
FUN - применяемая функция
Результатом будет являться вектор (если используемая функция возвращает одно значение), массив (если функция возвращает вектор значений) или список (если функция возвращает результат в виде более сложной структуры данных, например data.frame или матрица).
ВАЖНО! При применении функции apply к data.frame, data.frame неявно приводится к матрице. Матрицы как мы помним содержат данные только одного типа. Это означеат что если в data.frame 9 числовых колонок и 1 текстовая, то будет произведена конвертация в текстовую матрицу, и следовательно все действия будут производиться над текстовой матрицей.
Пример
Чуть более сложный пример - надо посчитать для каждой колонки среднее значение и извлечь из него квадратный корень. выполним это с использованием функции apply
Предложите альтернативный вариант расчета.
Типы переменных
Основными типами переменных в R являются:
- числовой (numeric)
- целочисленный (integer)
- текстовый (character)
- логический (logical) - только два значения: TRUE и FALSE
Важно: В дробных числах в R в качестве разделителя используется точка.
Создадим переменную x1 и присвоим ей значение 9.5.
Создадим переменную x2:
Узнаем, какого она типа:
Важно: Если забыли, что делает та или иная функция, можно спросить это у R:
Тип переменной можно менять. Например, превратим строку “2” в число 2:
Логические переменные легко превращаются в числовые:
Конечно, не у любой переменной мы можем поменять тип. Например, строку “abc” превратить в число не получится:
Сохранение данных в бинарном формате
Любые объекты созданные в R можно сохранить в бинарном формате в виде файлов .RData . Это позволяет осуществлять быструю загрузку и доступ к сохраненным данным.
Таким образом можно сохранить данные из однажды прочитанного текстового файла в бинарном формате и в дальнейшем загружать эти данные из него.
Чтобы сохранить содержимое переменной x1 используем следующий вызов (указание ключевого слова file является обязательным)
Преобразование типов и структур данных друг в друга
Преобразование типов данных осуществляется через группу функций, начинающихся на as.
Пример конвертации целочисленного вектора в текстовый
Особенности приведения чисел выраженных как factors к числовому виду.
Преобразуем вектор целых чисел в номинальную шкалу (factor).
Для обратной конвертации использование функции as.integer недостаточно.
Это связано с внутренним представлением типа данных factor. Эта структура представляет собой набор целочисленных значений, каждому из которых присвоено имя. В данном примере именами являются значения 1 и 0.
Поэтому для корретного преобразования factor в целочисленный тип данных необходимо предварительно провести конвертацию в текстовый вид.
Данная операция часто вызывает затрудние и служит причиной ошибок.
Подобно преобразованию типов данных возможно приведение различных структур данных к другому типу с помощью того же семейства функций, начинающихся на as. .
Преобразоваание матрицы в data.frame
Логические индексы
Генерация логического индекса (вектора) для вектора a
который можно использовать для выбора соответствующих элементов
Возможна комбинация логических индексов с использованием операторов AND (&) и OR (|)
Логическое отрицание, оператор NOT (!), инвертирует значения логических индексов
Логический индекс (вектор) можно преобразовать в числовой. Функция which возвращает порядковые номера элементов, значение которых TRUE
Числовые индексы
Выбор элементов вектора по их индексу
Из этого примера видно, что для индексирования и выбора элементов на самом деле используется вектор индексов.
Чтобы выбрать каждый второй элемент по индексу надо сгенерировать вектор, состоящий из четных чисел и использовать его для индексации исходного вектора.
Для удаления элементов по значению индекса перед ними добавляют знак минус
Особенности индексирования позволяют менять положение элементов и дублировать их. Это очень эффективный прием, о котором часто забывают.
С точки зрения индексирования матрицы и data.frames почти ничем не отличаются.
Создадим тестовый набор данных:
Выберем элемент строки 1 и колонки 2
Выберем все значения строки 1. Результатом будет новый data.frame
Выберем все значения колонки 1. Результатом будет вектор! Мы говорили выше, что data.frame это список колонок-векторов, и при выборе одной колонки присходит автоматическое преобразование результата к ветору.
Чтобы избежать этого необходимо добавить опцию drop . Теперь результатом будет data.frame
Для выбора блоков данных в качестве индексов строк и стобцов можно использовать
Отрицательные индексы используются для удаления соответствующих колонок и строк (обратите внимание, что удаляется не один элемент а колонки и строки):
что аналогично предыдущему примеру, приводящему к тому же результату
Читайте также: