Эта серия предназначена для начинающих R, которые ищут быстрое введение в основы R. Она охватывает основы R, включая типы данных, управляющие структуры, циклы, функции и расширенные структуры данных.

Если вы уже знакомы с этими темами и ищете исчерпывающее введение по всем важным темам статистики и машинного обучения с использованием R. Пожалуйста, начните со следующей серии, в которой обсуждаются все необходимые темы, связанные с наукой о данных.

Много способов чтения данных в R - 1

Содержание вдохновлено парой книг, которые я представил в дни IIM-B.

R для всех - Джаред П. Ландер

Практическая наука о данных с Р - Ниной Зумель и Джоном Маунтом

Все блоки кода, обсуждаемые в статье, представлены в виде разметки R в ссылке на Github .

Надеюсь, это поможет, и приступим !!!!!!!

R - мощный инструмент для всевозможных вычислений, обработки данных и научных вычислений. Прежде чем перейти к сложным операциям, возможным в R, мы должны начать с основ. Как и большинство языков, R имеет свои математические возможности, переменные, функции и типы данных.

Основы математики

Будучи языком статистического программирования, R, безусловно, можно использовать для выполнения базовой математики, и именно с этого мы начнем. Начнем со слов «привет, мир!» по основам математики: 1 + 1. В консоли есть правая угловая скобка (›), в которую необходимо ввести код. Давайте прямо попробуем немного сложную операцию в качестве примера.

(4 * 6) + 5

Они следуют базовому порядку операций: скобки, экспоненты, умножение, деление, сложение и вычитание (PEMDAS). Это означает, что операции в круглых скобках имеют приоритет над другими операциями. Следующим в списке приоритетов стоит возведение в степень. После этого производятся умножение и деление с последующим сложением и вычитанием.

До сих пор мы добавляли пробелы между операторами, например * и /. В этом нет необходимости, но рекомендуется как хорошая практика кодирования.

Переменные

Переменные являются неотъемлемой частью любого языка программирования, и R предлагает большую гибкость. В отличие от языков со статической типизацией, таких как C ++, R не требует объявления типов переменных. Переменная может принимать любой доступный тип данных. Он также может содержать любой объект R, например функцию, результат анализа или график. Одна переменная может в какой-то момент содержать число, затем символ, а затем снова число.

Есть несколько способов присвоить значение переменной, и, опять же, это не зависит от типа присваиваемого значения. Допустимые операторы присваивания - <- и =, причем предпочтительным является первый. Например, давайте сохраним 2 в переменную x и 5 в переменную y. Оператор стрелки также может указывать в другом направлении.

x <- 2
y = 5
3 -> z

Операцию присваивания можно использовать последовательно для одновременного присвоения значения нескольким переменным.

a <- b <- 7

Более трудоемкий, хотя иногда и необходимый способ назначения переменных - использование функции assign .

assign(“j”, 4)

Имена переменных могут содержать любую комбинацию буквенно-цифровых символов, а также точек (.) и подчеркивания (_). Однако они не могут начинаться с числа или символа подчеркивания.

Наиболее распространенной формой назначения в сообществе R является стрелка влево (<-), которую сначала может показаться неудобной в использовании, но со временем она становится второй натурой. Это даже кажется логичным, поскольку переменная как бы указывает на свое значение. Также есть особенно приятное преимущество для людей, пришедших из таких языков, как SQL, где один знак равенства (=) проверяет равенство.

Обычно считается лучшей практикой использовать для переменных фактические имена, обычно существительные, а не отдельные буквы. Это дает больше информации человеку, читающему код. Это видно на протяжении всей книги.

По разным причинам может потребоваться удалить переменную. Это легко сделать с помощью remove или его ярлыка rm.

rm(j)

Это освобождает память, так что R может хранить больше объектов, хотя это не обязательно освобождает память для операционной системы. Чтобы гарантировать это, используйте gc, который выполняет сборку мусора, освобождая неиспользуемую память операционной системе. R периодически автоматически выполняет сборку мусора, поэтому эта функция не важна.

Типы данных

В R существует множество типов данных, в которых хранятся различные типы данных. Скорее всего будут использоваться четыре основных типа данных: numeric, character (строка), Date/POSIXct (на основе времени) и logical (ИСТИНА / ЛОЖЬ). Тип данных, содержащихся в переменной, проверяется функцией класса

class(x)

Числовые данные

Как и ожидалось, R отлично справляется с текущими числами, поэтому числовые данные являются наиболее распространенным типом в R. Чаще всего используются числовые данные numeric. Это похоже на float или double на других языках. Он обрабатывает целые и десятичные числа, как положительные, так и отрицательные, и, конечно же, ноль. Числовое значение, хранящееся в переменной, автоматически считается числовым. Проверка того, является ли переменная числовой, выполняется с помощью функции is.numeric.

is.numeric(x)

Другой важный, хотя и реже используемый тип - integer. Как следует из названия, это только для целых чисел, без десятичных. Чтобы присвоить переменной целое число, необходимо добавить к значению L. Как и при проверке числа, используется функция is.integer.

i <- 5L
is.integer(i)

Обратите внимание, что, хотя i является целым числом, оно также пройдет числовую проверку. R прекрасно продвигает integers в numeric , когда это необходимо. Это очевидно при умножении целого числа на числовое, но, что важно, это работает при делении integer на другое integer, в результате чего получается десятичное число.

Данные персонажа

Несмотря на то, что он не является явно математическим, символьный (строковый) тип данных очень распространен в статистическом анализе и требует осторожного обращения. R имеет два основных способа обработки символьных данных: character и factor. Хотя внешне они могут показаться похожими, с ними обращаются по-разному.

x <- "data"
y <-  factor("data")

Обратите внимание, что x содержит слово «данные», заключенное в кавычки, а y содержит слово «данные» без кавычек и вторую строку информации о levels of y. Мы увидим об этом больше, когда обсудим Vectors.

Символы чувствительны к регистру, поэтому «Данные» отличаются от «данных» или «ДАННЫЕ». Чтобы найти длину character (или numeric), используйте функцию nchar. Но это не сработает для факторных данных, как показано ниже.

nchar(x)
nchar(y)

Тип даты

Работать с датами и временем на любом языке может быть сложно, и, что еще больше усложняет ситуацию, R имеет множество различных типов дат. Наиболее полезными являются Date и POSIXct. Date сохраняет только дату, а POSIXct сохраняет дату и время. Оба объекта фактически представлены как количество дней (Date) или секунд (POSIXct) с 1 января 1970 года.

date1 <- as.Date("2012-06-28")
date1

date2 <- as.POSIXct("2012-06-28 17:42")
date2

Более легкое управление объектами даты и времени может быть выполнено с помощью пакетов lubridate и chron . Использование таких функций, как as.numeric или as.Date, не просто изменяет форматирование объекта, но фактически изменяет базовый тип.

Логический тип

Logicals - это способ представления данных, которые могут быть либо TRUE , либо FALSE. Численно TRUE то же самое, что 1, а FALSE то же самое, что 0. Итак, TRUE ∗ 5 равно 5, а FALSE * 5 равно 0.

Подобно другим типам, логические имеют свой собственный тест с использованием функции is.logical.

k <- TRUE
class(k)
is.logical(k)

R предоставляет T и F в качестве ярлыков для TRUE и FALSE соответственно, но лучше не использовать их, поскольку они представляют собой просто переменные, хранящие значения TRUE и FALSE и могут быть перезаписаны, что может вызвать большое разочарование. Логика может быть результатом сравнения двух чисел или символов.

Векторы

vector - это набор элементов одного типа. Например, c(1, 3, 2, 1, 5) - это вектор, состоящий из чисел 1, 3, 2, 1, 5 в указанном порядке. Точно так же c(“R”, “Excel”, “SAS”, “Excel”) - это вектор из символьных элементов «R», «Excel», «SAS» и «Excel». Вектор не может быть смешанного типа.

Vectors играют важную и полезную роль в R. Векторы в R не только являются простыми контейнерами, но и отличаются тем, что R - это vectorized язык. Это означает, что операции применяются к каждому элементу вектора автоматически, без необходимости перебирать вектор. Это мощная концепция, которая может показаться чуждой людям, пришедшим из других языков, но это одна из величайших черт R.

Vectors не имеют размерности, что означает, что не существует таких вещей, как вектор-столбец или вектор-строка. Эти векторы не похожи на математический вектор, где есть разница между ориентацией row и column .

Самый распространенный способ создания вектора - c. “c” означает "комбинировать", потому что несколько элементов объединяются в вектор.

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

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

x*3

Никаких петель не требуется. Addition, subtraction и division так же просто. Это также работает для любого количества операций.

Ранее мы создали вектор из первых десяти чисел с помощью функции c, которая создает вектор. Ярлык - это оператор : , который генерирует последовательность последовательных чисел в любом направлении.

c(1:10)

Vector операции можно расширить еще больше. Допустим, у нас есть два вектора одинаковой длины. Каждый из соответствующих элементов может работать вместе.

x <- 1:10
y <- -5:4
## Add them
x+y

Работа с двумя vectors неравной длины становится немного сложнее. Более короткий вектор перерабатывается, то есть его элементы повторяются по порядку, пока они не будут сопоставлены с каждым элементом более длинного вектора. Если более длинный не кратен более короткому, выдается предупреждение.

x + c(1, 2)
x + c(1, 2, 3)

Сравнения также работают с векторами. Здесь результатом является вектор одинаковой длины, содержащий ИСТИНА или ЛОЖЬ для каждого элемента.

x <= 5

Чтобы проверить, все ли результирующие элементы равны TRUE, используйте функцию all . Аналогичным образом функция any проверяет, является ли какой-либо элемент TRUE.

x <- 10:1
y <- -4:5
## Checking any and all
any(x < y)
all(x < y)

Доступ к отдельным элементам vector осуществляется с помощью квадратных скобок ([ ]). Первый элемент x извлекается путем ввода x[1], первых двух элементов x[1:2] и непоследовательных элементов x[c(1, 4)].

x[c(1, 4)]

Это работает для всех типов векторов, будь то numeric, logical, character и так далее. Давать имена векторам можно как во время создания, так и постфактум.

c(One="a", Two="y", Last="r")

Факторные векторы

Factors - важная концепция в R, особенно при построении моделей. Давайте создадим простой вектор текстовых данных с несколькими повторениями. Мы начнем с вектора q, который мы создали ранее, и добавим к нему несколько элементов.

q2 <- c("Hockey", "Lacrosse", "Hockey", "Water Polo", "Hockey", "Lacrosse")
q2Factor <- as.factor(q2)
q2Factor

Обратите внимание, что после печати каждого элемента q2Factor, R также распечатывает уровни q2Factor. Уровни фактора - это уникальные значения этой факторной переменной. Технически R присваивает каждому уникальному значению фактора уникальное целое число, привязывая его к символьному представлению. Это можно увидеть с помощью as.numeric.

as.numeric(q2Factor)

В обычном factors порядок levels не имеет значения, и один уровень не отличается от другого. Однако иногда важно понимать порядок факторов, например, при кодировании уровней образования. Установка ordered argument на TRUE создает упорядоченный коэффициент с порядком, указанным в аргументе уровней.

factor(x=c("High School", "College", "Masters", "Doctorate"),     levels=c("High School", "College", "Masters", "Doctorate"),       ordered=TRUE)

Factors могут значительно уменьшить размер переменной, потому что они хранят только уникальные значения, но они могут вызвать головную боль при неправильном использовании.

Отсутствующие данные - NA против NULL

Отсутствующие данные играют важную роль как в статистике, так и в вычислениях, и R имеет два типа отсутствующих данных: NA и NULL. Хотя они похожи, но ведут себя по-разному, и это различие требует внимания.

Часто у нас будут данные, в которых отсутствуют значения по любому количеству причин. Статистические программы используют различные методы для представления отсутствующих данных, таких как dash, period или даже число 99. R использует NA. NA часто будет рассматриваться как просто еще один элемент вектора. is.na проверяет каждый элемент вектора на missingness.

z <- c(1, 2, NA, 8, 3, NA, 3)
is.na(z)

NA вводится простым вводом букв “N” и “A”, как если бы они были обычным текстом. Это работает для любого вектора.

Обработка недостающих данных - важная часть статистического анализа. Есть много техник в зависимости от области и предпочтений. Одним из популярных методов является multiple imputation, который подробно обсуждается в Chapter 25 of Andrew Gelman and Jennifer Hill’s book Data Analysis Using Regression and Multilevel/Hierarchical Models, и реализован в пакетах mi, mice и Amelia .

NULL это отсутствие чего-либо. Это не совсем missingness, это nothingness. Иногда функции могут возвращать NULL , а их аргументы могут быть NULL. Важное различие между NA и NULL состоит в том, что NULL равен atomical и не может существовать в vector. Если использовать внутри vector, он просто исчезает.

z <- c(1, NULL,3)
length(z)
z

Несмотря на то, что он был введен в вектор z, он не был сохранен в z. Фактически, z состоит всего из двух элементов. Тест на NULL значение составляет is.null. Поскольку NULL не может быть частью вектора, is.null соответственно не векторизуется.

Трубы

Новой парадигмой вызова функций в R является pipe. Канал из magrittr package работает, беря значение или объект с левой стороны конвейера и вставляя его в первый аргумент функции, которая находится с правой стороны конвейера. Простым примером может служить использование канала для подачи x в mean функцию.

library(magrittr)
x <- 1:10
x %>% mean

Pipes наиболее полезны при использовании в конвейере для объединения серии вызовов функций. Учитывая вектор z, содержащий числа и NAs, мы хотим узнать, сколько NAs присутствует. Традиционно это делается с помощью вложенных функций.

z <- c(1, 2, NA, 8, 3, NA, 3) 
sum(is.na(z))
## Using Pipes
z %>% is.na %>% sum

Pipes Читайте более естественно слева направо, что упрощает понимание кода. Использование каналов незначительно медленнее, чем вызовы вложенных функций, хотя, как Hadley Wickham примечания, pipes не будет серьезным узким местом в коде.

При подключении объекта к функции без установки каких-либо дополнительных аргументов скобки не нужны. Однако, если используются дополнительные аргументы, они должны быть названы и заключены в круглые скобки после вызова функции. Первый аргумент не используется, поскольку труба уже вставила левый объект в первый аргумент.

z %>% mean(na.rm=TRUE)

Данные бывают разных типов, и R хорошо с ними справляется. Помимо основных вычислений, R может обрабатывать numeric, character и временные данные. Одна из самых приятных частей работы с R, хотя и требует другого подхода к программированию, - это vectorization. Это позволяет работать с несколькими элементами вектора одновременно, что приводит к более быстрому и большему количеству математического кода. В следующей статье мы обсудим расширенные структуры данных, доступные в R.

Расширенные структуры данных в R - 2

Делитесь своими мыслями и поддержкой, комментируя и делясь статьей среди своих коллег.