Синтаксис R может показаться немного причудливым, особенно если вы ориентируетесь на любой другой язык программирования. Вот некоторые необычные черты языка, которые вам может быть полезно понять, когда вы отправляетесь в путешествие по изучению R. путеводитель по Р." Чтобы прочитать с самого начала, ознакомьтесь с введением; на этой странице есть ссылки на другие части этой серии.]
Содержание статьи
Присвоение значений переменным
В большинстве других известных мне языков программирования знак равенства присваивает определенное значение переменной Переменная. Вы знаете, x = 3 означает, что x теперь содержит значение 3. ]x <- 3
Not:
x = 3
Чтобы добавить к потенциальной путанице, знак равенства на самом деле может использоваться как оператор присваивания в R — большую часть (но не всегда) времени. <- и забудьте, что равные всегда разрешены. Это рекомендуется в руководстве по стилю tidyverse (tidyverse – это группа чрезвычайно популярных пакетов), которое, в свою очередь, используется такими организациями, как Google, для руководства по стилю R – и то, что вы увидите в большинстве кодов R.
(Если это недостаточно хорошее объяснение для вас и вы действительно очень хотите узнать все тонкости R’s 5 — да, пересчитайте их, 5 — варианты назначения, ознакомьтесь с Страница операторов присваивания в руководстве по R.)
Тем не менее, в нескольких местах вы увидите знак равенства. Один из них — при присвоении значения по умолчанию аргументу при создании функции, например
myfunction <- function(myarg1 = 10) {
# здесь некоторый код R с использованием myarg1
}
[]
Еще одна функция находится в некоторых функциях, таких как функция mutate() пакета dplyr (создает или изменяет столбцы во фрейме данных).
Еще одно замечание о переменных: язык R чувствителен к регистру. Итак, переменная x — это не то же самое, что X. Это относится практически ко всему в R; например, функция subset()
не будет такой же, как Subset()
.
c предназначена для объединения (или объединения, а иногда и преобразования/приведения. )
Когда вы создаете массив в большинстве языков программирования, синтаксис выглядит примерно так:
myArray = array(1, 1, 2, 3, 5, 8);
Или:
int myArray = {1, 1, 2, 3, 5, 8};
Или может быть:
myArray = [1, 1, 2, 3, 5, 8]
Однако в R есть дополнительная часть: чтобы поместить несколько значений в одну переменную, вы используете c()
например:
my_vector <- c(1, 1, 2, 3, 5, 8)
Если вы забудете, что c()
вы получите сообщение об ошибке. Когда вы начинаете работать с R, вы, вероятно, будете сталкиваться с ошибками, связанными с отсутствием c() a lot. (По крайней мере, я так думал.) Однако в конечном итоге это становится чем-то, о чем вы мало думаете. И теперь, когда я подчеркнул важность этой функции , я (неохотно) скажу вам, что есть случай, когда вы можете пропустить это — если вы имеете в виду последовательные значения в диапазоне с двоеточием между минимумом и максимумом, например:
my_vector <- (1:10)
Вероятно, вы будете часто сталкиваться с этим стилем в руководствах и текстах по R, и вы можете сбить с толку, увидев c()
требуется для некоторых нескольких значений, но не для других. Обратите внимание, что использование c()
с диапазоном, разделенным двоеточием, не вредит чему-либо, даже если это не требуется, например:
my_vector <- c(1:10)
Еще один важный момент о функции c()
: она предполагает, что все в вашем векторе имеет одни и те же данные тип — то есть все цифры или все символы. Если вы создадите вектор, такой как:
my_vector <- c(1, 4, "hello", TRUE)
Вы не иметь вектор с двумя целочисленными объектами, одним символьным объектом и одним логическим объектом. Вместо этого c()
сделает все возможное, чтобы преобразовать их все во все объекты одного типа, в данном случае во все символьные объекты. Таким образом, my_vector будет содержать «1», «4», «привет» и «ИСТИНА». Вы также можете думать о c()
как о "преобразовании" или "принуждении". , а не вектор. Вы создаете список с помощью функции list()
а не c(),
например:
My_list <- list(1,4," привет", TRUE)
Теперь у вас есть переменная, которая содержит число 1, число 4, символьный объект "привет" и логический объект TRUE.
Индексы векторов в R начинаются с 1, а не с 0
В большинстве языков программирования первым элементом вектора, списка или массива является элемент 0. В R это элемент 1. my_vector[1] является первым элементом. элемент в my_vector. Если вы говорите с другого языка, поначалу это будет странно. Но как только вы привыкнете к этому, вы, вероятно, поймете, насколько это невероятно удобно и интуитивно понятно, и удивитесь, почему больше языков не используют эту более удобную для человека систему. В конце концов, люди считают вещи, начиная с 1, а не с 0!
Циклы без циклов
Перебор набора данных с помощью циклов вроде for и while краеугольный камень многих языков программирования. Однако это не путь R. Хотя в R есть циклы for, while и repeat, вы, скорее всего, увидите операции, применяемые к сбору данных с помощью функций apply() или пакета purrr tidyverse.
Но сначала немного основ.
Если у вас есть вектор чисел, например:
my_vector <- c(7,9,23, 5)
и, например, вы хотите умножить каждое на 0,01, чтобы преобразовать их в проценты, как бы вы это сделали? Вам вообще не нужны циклы for, foreach или while. Вместо этого вы можете создать новый вектор с именем my_pct_vectors следующим образом: элемент в векторе. Многие функции R уже векторизованы, а другие нет, и важно знать разницу. Например, if()
не векторизована, но есть версия ifelse()
. вектор, вы увидите сообщение об ошибке, например
условие имеет длину > 1, и будет использоваться только первый элемент
Однако обычно при анализе данных вы хотите применить функции к более одного элемента в ваших данных: нахождение средней зарплаты по названию должности, например, или стандартное отклонение стоимости собственности по сообществу. Для этого предназначена группа функций apply()
а также в base R и функции в пакете tidyverse purrr. Я изучил R, используя для этого старый пакет plyr — и, хотя мне очень нравится этот пакет, он, по сути, устарел. В семействе apply более полудюжины функций, в зависимости от типа данных. объект обрабатывается и какой тип объекта данных возвращается. «Иногда бывает очень сложно заставить эти функции работать именно так, как вы предполагали, особенно для новичков в R», — говорится в сообщении в блоге Revolution Analytics, которое фокусируется на R корпоративного класса, рекламируя plyr вместо базового R.
Старый добрый apply()
запускает функцию для каждой строки или каждого столбца двумерной матрицы или фрейма данных, где все столбцы являются одними и теми же данными тип. Вы указываете, применяете ли вы строки или столбцы, добавляя аргумент 1 для применения по строке или 2 для применения по столбцу. Например:
apply(my_matrix, 1, median)
возвращает медиану каждой строки в my_matrix и
apply(my_matrix , 2, median)
вычисляет медиану каждого столбца.
Другие функции семейства apply(), такие как lapply() или tapply(), имеют дело с разными вводом/выводом типы данных. Австралийский статистический биоинформатик Нил Ф.В. Сондерс (Neal FW Saunders) написал хорошее краткое введение в применение R в своем блоге, если вы хотите узнать больше и увидеть несколько примеров. руководство. Но если вы хотите узнать больше, посетите веб-сайт мурлыканья и/или сайт с обучающими материалами Дженни Брайан по мурлыканью. все типы данных R и как они ведут себя сразу же, как новичок? Если ваша цель — стать экспертом по R, тогда да, вы должны знать все тонкости типов данных. Но я предполагаю, что вы здесь, чтобы попытаться создать быстрые графики и статистику, прежде чем погрузиться в создание сложного кода.
Итак, вот что я предлагаю вам помнить сейчас: R имеет несколько типов данных. . Некоторые из них особенно важны при работе с базовыми данными. И большинство функций требуют, чтобы ваши данные были определенного типа и структуры. Более конкретно, типы данных R включают целые, числовые, символьные и логические. Отсутствующие значения представлены NaN (если математическая функция не будет работать должным образом) или NA (отсутствуют или недоступны). несколько элементов одного типа, например:
1, 5, 7
или
"Билл", "Боб", "Сью"
одиночное число или строка символов также вектор — вектор длины 1. Когда вы получаете доступ к значению переменной, которая имеет только одно значение, например, 73 или " Узнайте больше о R на Computerworld.com», вы также увидите это в своей консоли перед значением: распечатка начинается с элемента вектора номер один. Если у вас есть вектор с большим количеством значений, поэтому распечатка занимает несколько строк, каждая строка будет начинаться с числа в скобках, говорящего вам, с какого номера элемента вектора начинается эта конкретная строка. (См. снимок экрана ниже.) 06/06/rvector1_338p-100392404-orig.jpg?auto=webp&quality=85,70" class="lazy" loading="lazy"/>
И, кстати, R предполагает, что 3 — это тот же класс, что и 3.0 — числовой (то есть с десятичной точкой). Если вы хотите целое число 3, вам нужно обозначить его как 3L или с as.int функция егер(). В ситуации, когда это важно для вас, вы можете проверить, какой тип номера у вас есть, используя функцию class()
:
class(3)
Класс (3L)
Существует несколько функций as()
для преобразования одного типа данных в другой, включая as.character()
as.list( )
и as.data.frame()
.
R также имеет специальные типы данных, которые представляют особый интерес при анализе данных, таких как матрицы и фреймы данных. Матрица имеет строки и столбцы; вы можете найти размер матрицы с помощью dim(), например
dim(my_matrix)
Матрица должна иметь все одинаковые типы данных в каждом столбце, например цифры повсюду. Фреймы данных используются гораздо чаще. Они похожи на матрицы, за исключением того, что один столбец может иметь тип данных, отличный от другого столбца, и каждый столбец должен иметь имя. Если у вас есть данные в формате, который может хорошо работать в качестве таблицы базы данных (или правильно сформированной электронной таблицы), они также, вероятно, будут хорошо работать в качестве фрейма данных R.
В отличие от Python, где это для двумерного типа данных требуется дополнительный пакет (pandas), фреймы данных встроены в R. Однако существуют пакеты, которые расширяют основные возможности фреймов данных R. Один из них, пакет tibble tidyverse, создает базовые фреймы данных с некоторыми дополнительными функциями. Другой, data.table, предназначен для молниеносной скорости при обработке больших наборов данных. Он добавляет множество функций прямо в скобки объекта таблицы данных
mydt[code to filter columns, code to create new columns, code to group data]
Многие из data.table покажутся вам знакомыми, если вы знаете SQL. Чтобы узнать больше о data.table, посетите веб-сайт пакета или посмотрите это вводное видео:
При работе с базовым фреймом данных вы можете думать о каждой строке как о записи базы данных, а о каждом столбце – как о поле базы данных. Существует множество полезных функций, которые можно применить к фреймам данных, например, summary()
в base R и glimpse() из пакета dplyr.
Вернуться к особенностям base R: есть несколько способов чтобы найти базовый тип данных объекта, но не все они возвращают одно и то же значение. Например, class()
и str()
вернут data.frame для объекта фрейма данных, но mode()
вернет более общий список.
Если вы хотите узнать больше о типах данных в R, вы можете посмотреть эту видео-лекцию Роджера Пэна, доцента биостатистики в Университете Джона Хопкинса. Школа общественного здравоохранения Блумберга:
Роджер Пэн, адъюнкт-профессор биостатистики в Школе общественного здравоохранения Блумберга имени Джона Хопкинса, объясняет типы данных в R.
Еще одна полезная концепция в завершение этого раздела — подождите, мы почти закончили: факторы. Они представляют категории в ваших данных. Итак, если у вас есть фрейм данных с сотрудниками, их отделами и их зарплатами, зарплаты будут числовыми данными, а сотрудники будут символами (строками на многих других языках); но вы можете захотеть, чтобы отдел был фактором — категорией, по которой вы можете сгруппировать или смоделировать свои данные. Факторы могут быть неупорядоченными, например, отдел, или упорядоченными, например, «плохо», «удовлетворительно», «хорошо» и «отлично». ] Когда вы начинаете работать в среде R, она очень похожа на оболочку Unix. На самом деле, некоторые действия командной строки R ведут себя так, как вы ожидаете, если вы работаете в среде Unix, а другие — нет.
Хотите просмотреть несколько последних команд? Стрелка вверх работает в R так же, как и в Unix — продолжайте нажимать ее, чтобы увидеть предыдущие команды. файлов, как в Unix. Скорее, он предоставит список объектов в вашем текущем сеансе R.
Хотите увидеть свой текущий рабочий каталог? pwd, который вы использовали бы в Unix, просто выдает ошибку; вам нужно getwd()
.
rm(my_variable)
удалит переменную из вашего текущего сеанса.