С увеличением вычислительной мощности увеличивается доступ к большим объемам свободно доступных данных. Люди отслеживают свою жизнь с помощью трекеров производительности, калорий, фитнеса и сна. Правительства публикуют данные опроса слева и справа, а компании проводят тестирование аудитории, которое необходимо проанализировать. Даже сейчас есть много данных , готовых к тому, чтобы их схватили и посмотрели.
В этом уроке мы рассмотрим основы языка программирования R — языка, созданного исключительно для статистических вычислений. Я не буду утомлять вас определениями из Википедии — вместо этого давайте углубимся в это. В этом введении мы рассмотрим установку IDE и языка по умолчанию, а также типы данных.
Установка
R — это и язык программирования, и программная среда, что означает, что он полностью автономен. Есть два шага для его установки:
- загрузите и установите последнюю версию R: http://www.r-project.org/
- Загрузите и установите RStudio, R IDE: http://www.rstudio.com/
Оба бесплатны, оба с открытым исходным кодом. R будет установлен в качестве базового механизма, который обеспечивает вычисления RStudio, в то время как RStudio предоставит примеры данных, автозаполнение команд, файлы справки и эффективный интерфейс для быстрого выполнения задач. Вы можете написать R-код в простых текстовых файлах, как и в большинстве других языков, но это действительно не рекомендуется, учитывая, сколько существует команд и как быстро можно получить сложные вещи.
После установки инструментов запустите R Studio.
Области IDE
Давайте кратко объясним графический интерфейс. Есть четыре основные части. Я объясню порядок по умолчанию, хотя учтите, что его можно изменить в меню «Настройки» / «Настройки» -> «Макет панели».
Редактор
Верхний левый квадрант является редактором. Здесь вы пишете R-код, который хотите сохранить для дальнейшего использования — функции, классы, пакеты и т. Д. Это, по сути, идентично главному окну любого другого редактора кода. Помимо некоторых не требующих пояснений кнопок и других кнопок, которые не должны касаться вас в этой начальной точке, есть также флажок «Источник при сохранении». Это означает «Загружать содержимое файла во время выполнения моей консоли каждый раз, когда я сохраняю файл». Это должно быть включено всегда, оно ускоряет процесс разработки одним щелчком мыши.
Консоль
В нижнем левом квадранте находится консоль. Это REPL for R, в котором вы можете проверить свои идеи, наборы данных, фильтры и функции. Это то место, где вы будете проводить большую часть своего времени в начале — именно здесь вы проверяете идею, которая у вас работает, прежде чем копировать ее в редактор выше. Это также среда, в которой ваши R-файлы будут получены при сохранении (см. Выше), поэтому всякий раз, когда вы разрабатываете новую функцию в R-файле выше, она автоматически становится доступной в этом REPL. Мы будем проводить много времени в REPL в оставшейся части этой статьи.
История / Окружающая среда
В верхнем правом квадранте есть две вкладки: окружение и история.
Среда относится к среде консоли (см. Выше) и подробно перечислит каждый символ, определенный вами в консоли (с помощью источника или напрямую). То есть, если у вас есть функция, доступная в REPL, она будет указана в среде. Если у вас есть переменная или набор данных, он будет там указан. Здесь вы также можете импортировать пользовательские наборы данных вручную и мгновенно сделать их доступными в консоли, если вы не хотите вводить команды для этого. Вы также можете проверить окружение других пакетов, которые вы установили и загрузили (подробнее о пакетах позже). Поиграйте с этим — вы ничего не сломаете.
В журнале перечислены все команды консоли, которые вы выполнили с момента запуска последнего проекта. Он сохраняется в скрытом файле .Rhistory
папке вашего проекта. Если вы не решите сохранить свою среду после сеанса, история не будет сохранена.
Разное
Нижняя правая панель представляет собой панель «Разное» и содержит пять отдельных вкладок. Первый, Файлы , не требует пояснений. Вкладка Графики будет содержать графики, которые вы создали с помощью R. На ней вы можете масштабировать, экспортировать, настраивать и проверять свои графики и графики. Вкладка « Пакеты » позволяет устанавливать дополнительные пакеты в R. Краткое описание находится рядом с каждым доступным пакетом, хотя их намного больше, чем перечисленных там. Мы рассмотрим репозитории пакетов в следующем посте. Вкладка « Справка » позволяет выполнять поиск в невероятно обширном справочном каталоге и будет автоматически открываться при каждом вызове справки по команде в консоли (справка вызывается путем добавления к имени команды знака вопроса, например ?data.frame
). Наконец, Viewer — это встроенный браузер RStudio. Да, вы можете разрабатывать веб-приложения с помощью R и даже запускать в нем локальные веб-приложения.
Встроенные наборы данных
В приведенном ниже тексте всякий раз, когда я упоминаю об использовании команды, предположим, что это означает пробить ее в консоль. Итак, если я скажу «Мы смотрим на справку для фреймов данных с ?data.frame
», вы сделаете это:
RStudio поставляется с некоторыми наборами данных для новых пользователей. Чтобы использовать встроенный набор данных, мы загружаем его функцией data
и предоставляем аргумент, соответствующий набору, который мы хотим. Чтобы увидеть все доступные встроенные наборы, введите data()
без аргумента.
Рассматривая список доступных наборов данных, давайте загрузим очень маленький для начала:
data("women")
На панели «Среда» должна появиться переменная women
, хотя во втором поле указано <Promise>
. Обещание в этом случае просто означает «данные будут там, когда они вам действительно понадобятся». Мы сказали R загрузить этот набор, но на самом деле мы его нигде не использовали, поэтому не чувствовали необходимости загружать его полностью в память. Давайте скажем R, что нам это нужно. В консоли распечатайте весь набор, просто вызвав:
women
Это эквивалентно:
print(women)
Примечание: мы будем использовать первый подход, просто потому, что он меньше печатает. Помните — в R последнее значение, которое печатается без выражения (например, присваивает или суммирует что-либо), автоматически выводится на консоль.
Цифры будут отображаться в консоли, и запись «Окружающая среда» для women
должна измениться. Теперь вы также сможете увидеть данные на панели среды, щелкнув синюю стрелку раскрытия рядом с именем переменной.
Этот набор имеет только 15 записей и, как таковой, не предлагает ничего ценного, но он достаточно хорош для игры в.
Для дальнейшего изучения набора, с которым вы имеете дело, необходимо помнить о нескольких функциях (демонстрация каждой из них приведена ниже в пояснениях):
-
nrow
/ncol
перечислит количество строк / столбцов соответственно -
summary
выводит сводку о столбцах набора. В случае набораwomen
у нас есть два числовых столбца (оба столбца являются числовыми, или, другими словами, каждый столбец является числовым вектором — подробнее о типах данных и векторах позже), и R знает, что когда вы запрашиваете его для анализа числового вектора, он должен дать вам типичные значения для таких коллекций: минимальное значение в наборе, среднее (среднее) между минимумом и средним, среднее (среднее из всех значений), среднее между средним и максимум и максимум, наибольшее число в столбце. Это делает это для высоты и ширины. Для разных типов векторов (например, те, в которых каждый элемент является словом, а не числом) выходные данные различны. -
str
str — это другой вид резюме. Фактически,str
означает «структура» и выводит сводную информацию о структуре набора данных. В нашем случае это скажет нам, что это «data.frame» (специальный тип данных, который мы объясним позже) с 15 obs (наблюдения или строки) и 2 переменными (или столбцами). Затем он переходит к списку всех столбцов в фрейме данных с некоторыми (но не всеми) их значениями, просто чтобы мы поняли, с какими значениями мы имеем дело. -
dim
дает вам размеры набора данных. Вызовdim(women)
дает нам15 2
что означает 15 строк и 2 столбца.length
может использоваться для подсчета количества вертикальных элементов в наборе — в векторах (см. ниже) это количество элементов, в наборах данных, таких какwomen
, это количество столбцов.
> nrow(women) [1] 15 > ncol(women) [1] 2 > summary(women) height weight Min. :58.0 Min. :115.0 1st Qu.:61.5 1st Qu.:124.5 Median :65.0 Median :135.0 Mean :65.0 Mean :136.7 3rd Qu.:68.5 3rd Qu.:148.0 Max. :72.0 Max. :164.0 > str(women) 'data.frame': 15 obs. of 2 variables: $ height: num 58 59 60 61 62 63 64 65 66 67 ... $ weight: num 115 117 120 123 126 129 132 135 139 142 ... > dim(women) [1] 15 2
Вы будете часто использовать эти функции, поэтому я рекомендую вам ознакомиться с ними. Загрузите некоторые другие наборы данных и проверьте их следующим образом. Не нужно знать их наизусть — этот пост и файлы справки всегда будут рядом для справки, но в любом случае приятно владеть ими.
Типы данных
R имеет некоторые типичные атомарные типы данных, о которых вы уже знаете из других языков, но также предоставляет некоторые более статистически ориентированные. Давайте кратко пройдемся по ним. Объясняя эти типы, я расскажу о их назначении . Назначение в R выполняется с помощью оператора «стрелка влево» или <-
, как в:
myString <- "Hello World"
R, однако, очень простителен и позволит вам использовать оператор присваивания =
в средах верхнего уровня, таких как консоль, если вам не хочется каждый раз печатать стрелку.
myString = "Hello World"
Я предлагаю вам привыкнуть к стрелке, но без нее вы не доберетесь очень далеко.
Чтобы проверить тип (или класс) переменной, можно использовать функцию class
(хотя str
сверху делает почти то же самое): class(myString)
.
атомная энергетика
Атомные классы — это базовые типы, из которых строятся другие.
символ
Класс символов — это ваша типичная строка, набор из одной или нескольких букв.
> myString <- "Hello World" > class(myString) [1] "character"
[1]
будет объяснено ниже, в разделе Векторы.
числовой
Соответствует «float» на других языках — указывает числовые значения, такие как 10, 15,6, -48792.5498982749879 и так далее.
> myNum <- 5.983904798274987298 > class(myNum) [1] "numeric"
Вы можете привести (изменить тип) числовые строковые значения к числовым типам, например так:
> myString <- "5.60" > class(myString) [1] "character" > myNumber <- as.numeric(myString) > myNumber [1] 5.6 > class(myNumber) [1] "numeric"
Существует также специальное число Inf
которое представляет бесконечность. Может использоваться в расчетах:
> 1/0 [1] Inf
Другое «число» — это NaN
что означает «не число». Это то, что вы получаете, когда делаете что-то вроде 0/0
.
целое число
Целые числа представляют собой целые числа, хотя они автоматически приводятся (изменяются) в числа при сохранении в переменные:
> myInt <- 209173987 > class(myInt) [1] "numeric"
Чтобы фактически заставить их быть целыми числами, нам нужно вызвать функцию, которая приводит их вручную, под названием as.integer
:
> myInt <- as.integer(myInt) > class(myInt) [1] "integer"
Вы можете предотвратить автоматическое приведение, установив целые числа с суффиксом L:
> myInt = 5L > class(myInt) [1] "integer"
Обратите внимание, что если вы дадите R число, превышающее то, что может хранить его память, оно автоматически приведет его к действительному числу, даже если вы поставите L в конце:
> myInt <- 2479827498237498723498729384 > class(myInt) [1] "numeric" > myInt [1] 2.479827e+27
но если вы затем попытаетесь привести это число к целому числу, R отбросит его, потому что оно просто не может сделать целые числа такими большими. Вместо числа вы получаете «NA», который является специальным типом в R, обозначающим «Недоступно», также известным как отсутствующее значение.
> myIntCoerced <- as.integer(myInt) Warning message: NAs introduced by coercion > myIntCoerced [1] NA > class(myIntCoerced) [1] "integer"
NA все еще имеет тип «целое число», но не имеет значения.
Обратите внимание, что при приведении чисел к целым числам десятичные разряды теряются. То же самое относится к принуждению из числовых десятичных строк:
> myString <- "5.60" > myNumeric <- 5.6 > myInteger1 <- as.integer(myString) > myInteger2 <- as.integer(myNumeric) > myInteger1 == myInteger2 [1] TRUE > myInteger1 [1] 5
Сложный
Объяснение сложных чисел немного выходит за рамки этого урока, особенно если вы не знакомы с ними в школе, но если вам интересно, вы можете узнать больше здесь . Они принимают форму a + bi
где a
и b
— действительные числа, а i
— мнимая. В R они построены со специальной complex
функцией.
> myComplex <- complex(1, 3292, 8974892) > myComplex [1] 3292+8974892i > class(myComplex) [1] "complex"
Вам они не понадобятся почти так же часто, как другие типы, но если вы хотите узнать больше о complex
функции, просто обратитесь за помощью к ней: complex
функция.
логический
Логические типы (логические значения) такие же, как и в большинстве других языков, и могут быть двумя вещами — либо истиной, либо ложью. True может быть представлен с TRUE
или T
тогда как false, как и ожидалось, FALSE
или F
> TRUE == T [1] TRUE > myBool <- TRUE > myBool == T [1] TRUE > myComparison <- 5 > 6 > myComparison == FALSE [1] TRUE > class(myComparison) [1] "logical"
Всякий раз, когда вы создаете выражение, результатом которого является значение «да» или «нет», вы получаете ИСТИНА или ЛОЖЬ — как в случае 5 > 6
выше. 5 не больше 6, поэтому выражение становится FALSE
. myComparison
образом, сравнение myComparison
с FALSE
дает значение TRUE
поскольку переменная myComparison
действительно содержит значение FALSE
.
Когда функция необходима, логические значения будут преобразованы в числа. Это означает, что если я напишу 1 + TRUE
консоль выдаст 2
, где 1 + FALSE
даст 1
. Аналогично, мы можем легко привести другие типы в логические ( as.logical(myVariable)
). Любое число или целое число со значением, не равным 0 или NA, будет давать TRUE
. 0 и 0L даст FALSE
. Строки типа «True», «TRUE», «true» и «T» будут преобразованы в «TRUE», «False», «FALSE», «false» и «F» будут « FALSE
. Любая другая строка приведёт к логическому значению NA.
Высшие Типы
Высшие типы — это типы, состоящие из низших.
Векторы и списки
Самым важным из всех, вектором, является набор элементов одного типа. В нашем предыдущем примере набора данных один столбец набора данных women
был числовым вектором , то есть это была коллекция, содержащая только числовые значения. Вектор может иметь только элементы одного и того же типа. Векторы можно создавать с помощью функции vector
, но обычно они создаются с помощью сокращенной функции c
(concatenate):
> myVector <- c("Hello", "World", "Third Element") > class(myVector) [1] "character" > myVector [1] "Hello" "World" "Third Element"
Здесь мы видим, что класс вектора является «символьным», что означает, что он содержит только значения символьного типа. Если мы распечатаем его, просто вызвав имя переменной, мы получим все три элемента и a [1]
. [1]
буквально означает: «Я выводю содержимое вашего вектора. Первый элемент в этой строке — это элемент № 1 в векторе ». То, что вы видите в []
полностью зависит от размера панели консоли и длины массива. Например:
> myVector <- c("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen") > myVector [1] "One" "Two" "Three" "Four" "Five" "Six" "Seven" [8] "Eight" "Nine" "Ten" "Eleven" "Twelve" "Thirteen" "Fourteen" [15] "Fifteen"
Число в квадратных скобках просто означает «Элемент после меня N-й в наборе». Он предназначен только для того, чтобы сделать вывод более читабельным и не влияет на реальные данные.
Обратите внимание, что векторы строго одномерны. Вы не можете добавить другой вектор в качестве элемента внутри существующего вектора — их элементы объединяются в один:
> v1 <- c("a", "b", "c") > v2 <- c("d", "e", "f") > v3 <- c(v1, v2) > v3 [1] "a" "b" "c" "d" "e" "f"
Вы можете генерировать целые числовые векторы, указав диапазон:
> myRange <- c(1:10) > myRange [1] 1 2 3 4 5 6 7 8 9 10
Списки похожи на векторы, только у них нет ограничений на возможность хранить элементы одного типа исключительно. Они создаются с помощью функции list
или c
если одним из добавляемых вами элементов является список:
> myList <- list(5, "Hello", "Worlds", TRUE) > class(myList) [1] "list" > myList [[1]] [1] 5 [[2]] [1] "Hello" [[3]] [1] "Worlds" [[4]] [1] TRUE
Как и с векторами, применяется правило одномерности. Добавление списка в другой объединит их элементы.
Выходные данные [[N]]
означают: «Первый элемент этого списка — это вектор с одним элементом 5, второй элемент этого списка — это вектор с одним элементом Hello… и т. Д.». Присоединение [[N]]
к переменная, которая содержит список, на самом деле возвращает элемент. Мы можем проверить это легко:
> class(myList[[1]]) [1] "numeric" > class(myList[[2]]) [1] "character" > class(myList[[3]]) [1] "character" > class(myList[[4]]) [1] "logical"
data.frame
Фреймы данных — это, по сути, таблицы со строками и столбцами, очень похожие на электронные таблицы. Набор данных о women
мы загрузили выше, был информационным. Вы можете получить доступ к отдельным столбцам данных, используя оператор $
для переменной и имя столбца:
> women$height [1] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
Результат возвращается как числовой вектор. Проверьте его класс с class(women$height)
.
Если имя столбца содержит пробелы, вы можете заключить его в кавычки ( women$"Female Height"
), но вы также можете получить доступ к столбцу по его числовой позиции в списке столбцов. Например, мы знаем, что высота — это первый столбец:
> head(women[1]) height 1 58 2 59 3 60 4 61 5 62 6 63 > head(women[[1]]) [1] 58 59 60 61 62 63
Функция head
говорит R, что нужно возвращать только первые 6 результатов — поэтому мы сохраняем нашу консоль красивой и без прокрутки, что отлично подходит для краткого просмотра наборов данных без распечатки их полностью. (Обратного можно достичь с помощью tail
который печатает последние 6 результатов).
Здесь мы видим, что при доступе к столбцу с одной квадратной скобкой [1]
мы получаем кадр данных, но с одним столбцом меньше. Однако, если мы получим доступ к нему с помощью двойной квадратной скобки [[1]]
, мы получим числовой вектор высот. Данные, возвращаемые с использованием одинарной скобки, остаются того же типа, что и родительские данные, в то время как средство доступа с двойной скобкой предназначается для конкретных значений в этом столбце и возвращает их в их наиболее элементарной форме, числовом векторе.
Мы создаем фреймы данных с data.frame
функции data.frame
:
> men <- data.frame(height = c(50:65), weight = c(150:165)) > head(men) height weight 1 50 150 2 51 151 3 52 152 4 53 153 5 54 154 6 55 155
Здесь мы создали образец набора данных для men
не похожий на набор women
из предыдущего.
Если мы хотим получить только имена столбцов, мы используем функцию names
. Мы даже можем присвоить ему значение и таким образом изменить имена столбцов:
> names(men) [1] "height" "weight" > names(men) <- c("Male Height", "Male Weight") > head(men) Male Height Male Weight 1 50 150 2 51 151 3 52 152 4 53 153 5 54 154 6 55 155
матрица
Матрицы являются многомерными векторами. Они похожи на кадры данных, но могут содержать только значения одного типа. Они создаются с помощью функции matrix
и нуждаются в количестве строк и столбцов в качестве параметров, а также в значениях, которые нужно поместить в следующие слоты:
> m <- matrix(nrow = 4, ncol = 5, 1:20) > m [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20
Что произойдет, если количество предоставленных значений не соответствует количеству ячеек?
> m <- matrix(nrow = 4, ncol = 5, 1:25) Warning message: In matrix(nrow = 4, ncol = 5, 1:25) : data length [25] is not a sub-multiple or multiple of the number of rows [4] > m [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20
Мы получаем предупреждение, но матрица все равно создается, а все дополнительные значения просто отбрасываются. Если значений меньше, чем ячеек, предоставленные значения повторно используются до заполнения матрицы:
> m <- matrix(nrow = 4, ncol = 5, 1:16) Warning message: In matrix(nrow = 4, ncol = 5, 1:16) : data length [16] is not a sub-multiple or multiple of the number of columns [5] > m [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 1 [2,] 2 6 10 14 2 [3,] 3 7 11 15 3 [4,] 4 8 12 16 4
Так же, как у фреймов данных есть атрибут / функция names
, так и у матриц есть dim
(размерность). Изменение этого свойства может изменить форму матрицы:
> m <- 1:15 > m [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 > dim(m) NULL > dim(m) <- c(3,5) > m [,1] [,2] [,3] [,4] [,5] [1,] 1 4 7 10 13 [2,] 2 5 8 11 14 [3,] 3 6 9 12 15 > dim(m) [1] 3 5 > dim(m) <- c(5,3) > m [,1] [,2] [,3] [1,] 1 6 11 [2,] 2 7 12 [3,] 3 8 13 [4,] 4 9 14 [5,] 5 10 15 > dim(m) [1] 5 3 > dim(m) <- NULL > m [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Здесь мы создали числовой вектор из 15 последовательных чисел (в таких случаях мы можем опустить c
). Атрибут dim
не существовал в нем, как видно из функции dim
возвращающей NULL, поэтому мы изменили его, присвоив ему числовой вектор 3, 5
. Это привело к перестановке элементов, чтобы вписаться в недавно построенную матрицу. Затем мы снова изменили размеры, инвертировав число столбцов и строк в 5, 3
, что снова привело к другой матрице. Наконец, обнуление размеров привело к появлению числового вектора с самого начала.
Также возможно комбинировать / расширять / изменять векторы, кадры данных и матрицы, используя cbind
и rbind
:
> v <- 1:5 > x <- 6:10 > bound <- cbind(v, x) > bound vx [1,] 1 6 [2,] 2 7 [3,] 3 8 [4,] 4 9 [5,] 5 10 > bound <- rbind(v, x) > bound [,1] [,2] [,3] [,4] [,5] v 1 2 3 4 5 x 6 7 8 9 10
факторы
Факторами являются векторы с метками. Это отличается от символьных или даже числовых векторов, потому что они, как говорят ребята, «самоописывают», что позволяет функциям R автоматически понимать их больше, чем другим типам. Они построены с помощью factor
функции, которая должна указывать вектор в качестве аргумента:
> f <- factor(c("Hello", "World", "Hello", "Annie", "Hello", "World")) > f [1] Hello World Hello Annie Hello World Levels: Annie Hello World > table(f) f Annie Hello World 1 3 2
Уровни перечисляют уникальные элементы в факторе. table
функция захватывает фактор и создает таблицу, состоящую из различных уровней фактора и количества их вхождений в фактор.
Лично я еще не нашел использования факторов в своих проектах, но я узнаю о них .
Вывод
В этой статье мы рассмотрели основные типы данных в R и основы использования RStudio. Теперь вы вооружены всеми знаниями, необходимыми для начала некоторых базовых операций с данными, о чем мы рассмотрим в следующем посте. Помните, что все функции, которые мы рассмотрели выше, полностью доступны для поиска в файлах справки с
?function
где «функция» — это имя функции.
При изучении языка программирования обычно сначала обучают типы данных, затем логические операторы и третьи структуры управления, прежде чем переходить к более сложным вещам, таким как функции и классы, но в этом случае, я считаю, мы заложили достаточно приличную основу, чтобы прыгнуть прямо. в огонь и учиться на примере. Мы рассмотрим все это на реальных, практических данных — но только если вы заинтересованы.
Дайте нам знать, что вы подумали об этом посте — прокомментируйте ниже, поделитесь им или просто «сердитесь» на форумах — если есть большой интерес к изучению R в нашей аудитории SitePoint, мы были бы более чем рады вдаваться в подробности ,