Фактор R: категориальная переменная и непрерывные переменные
⚡ Умное резюме
В языке R класс Factor хранит категориальные данные в виде вектора целочисленных кодов, сопоставленных с набором уровней, что позволяет языку отделять ограниченную группу категорий от непрерывного измерения.

Что такое фактор в R?
Коэффициент R Factor — это переменная, используемая для категоризации и хранения данных, имеющая ограниченное количество различных значений. Она хранит данные в виде вектора целочисленных значений. Factor в R также известен как категориальная переменная, которая хранит как строковые, так и целочисленные значения данных в качестве уровней. Factor в основном используется в статистическом моделировании и разведочном анализе данных с помощью R.
Внутри фактор представляет собой два объекта, движущихся вместе: целочисленный вектор кодов и атрибут символа с именем уровниКаждый код представляет собой позицию в векторе уровней, поэтому при выводе фактора отображаются слова, в то время как unclass() показывает цифры.
В наборе данных мы можем выделить два типа переменных: категорический и (CIJ).
- В описательной статистике категориальных переменных в R значение ограничено и обычно основано на конкретной конечной группе. Например, категориальной переменной в R могут быть страна, год, пол, род занятий.
- Однако непрерывная переменная может принимать любые значения, от целых чисел до десятичных дробей. Например, это может быть выручка, цена акции и т. д.
Это различие стоит оберегать, поскольку R молча выбирает разные значения по умолчанию для каждого типа столбцов. Числовой столбец суммируется с помощью среднего значения и медианы, а фактор — с помощью количества элементов на каждом уровне. Таким образом, хранение категории в виде текста или числа меняет получаемый анализ. Более широкий набор режимов хранения описан в руководстве по... Типы данных и операторы R.
Категориальные переменные
Категориальные переменные в R Они сохраняются в факторную переменную. Давайте рассмотрим приведенный ниже код для преобразования символьной переменной в факторную переменную в R. Многие процедуры моделирования и машинного обучения не могут обрабатывать необработанный текст, поэтому категории необходимо кодировать как уровни или числа до того, как будет построена модель.
Синтаксис
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
В базовом справочнике R описаны два дополнительных аргумента, которые опущены в приведенной выше сокращенной форме: исключать, которая удаляет значения до построения набора уровней, и птах, верхняя граница количества уровней, которая ускоряет преобразование очень больших векторов.
Аргументы:
- xВектор категориальных данных в R. Должен быть строкой или целым числом, а не десятичным.
- уровни: Вектор возможных значений, принимаемых переменной x. Этот аргумент необязателен. Значение по умолчанию — уникальный список элементов вектора x, отсортированный в порядке возрастания.
- этикетки: Добавьте метку к категориальным данным x в R. Например, 1 может соответствовать категории "мужской пол", а 0 — категории "женский пол".
- исключать: Вектор значений, которые будут отброшены при формировании множества уровней. Исключенные значения в результате становятся равными NA.
- приказал: Логический флаг, определяющий, следует ли считать уровни упорядоченными в указанном порядке.
- птах: Необязательная верхняя граница количества уровней, полезная для длинных векторов.
Это критически важно для анализа и выбора наиболее эффективных ключевых слов для улучшения рейтинга вашего сайта.
Давайте преобразуем символьный вектор в фактор и подтвердим изменение с помощью функции class().
# Create gender vector gender_vector <- c("Male", "Female", "Female", "Male", "Male") class(gender_vector) # Convert gender_vector to a factor factor_gender_vector <-factor(gender_vector) class(factor_gender_vector)
Выход:
## [1] "character" ## [1] "factor"
Класс переключился с символьного на факторный, и никакие значения на экране не изменились. Важно преобразовать string В R перед выполнением задачи машинного обучения эти категории преобразуются в факторную переменную, поскольку именно на этом этапе они становятся фиксированным, проверенным набором.
Категориальную переменную в R можно разделить на номинальная категориальная переменная и порядковая категориальная переменная.
Номинальная категориальная переменная
Номинальная категориальная переменная имеет несколько значений, но порядок их упорядочивания не имеет значения. Например, мужской или женский пол. Номинальные категориальные переменные в R не имеют никакого порядка.
# Create a color vector color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow') # Convert the vector to factor factor_color <- factor(color_vector) factor_color
Выход:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
По параметру factor_color мы не можем определить порядок. Список уровней отсортирован только по алфавиту, поскольку аргумент levels не был указан, поэтому R отсортировал уникальные значения самостоятельно. Эта сортировка следует активной локали, а не простому ASCII-коду, что является одной из причин явно указывать уровни всякий раз, когда порядок имеет значение.
Порядковая категориальная переменная
Порядковые категориальные переменные имеют естественный порядок. Ранжирование определяется порядком вектора, передаваемого в функцию. уровни Аргумент `orordered = TRUE` указывает R рассматривать эту последовательность как ранжирование, а не как простой список. Установка `orordered = FALSE` не меняет порядок ранжирования; она просто создает обычный неупорядоченный фактор. Чтобы ранжировать от наивысшего к наинизшему, нужно перевернуть сам вектор уровней.
Это критически важно для анализа и выбора наиболее эффективных ключевых слов для улучшения рейтинга вашего сайта.
Мы можем использовать сводку для подсчета значений для каждой факторной переменной в R.
# Create Ordinal categorical vector day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening') # Convert `day_vector` to a factor with ordered level factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight')) # Print the new variable factor_day
Выход:
## [1] evening morning afternoon midday
midnight evening
В консоли сначала выводятся значения, а затем рейтинг. Следующий блок начинается со строки Levels, которая по-прежнему закомментирована, поэтому рейтинг остается видимым, пока вызов summary() добавляется к предыдущему коду.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Выход:
## morning midday afternoon evening midnight ## 1 1 1 2 1
В R уровень упорядочен от «утра» до «полуночи», как указано в аргументе levels. Поскольку фактор упорядочен, операторы сравнения, такие как < и >, также работают с ним, чего они не делают с номинальным цветовым фактором, указанным выше.
Непрерывные переменные
В R переменные непрерывного класса являются значениями по умолчанию. Они хранятся как числовые или целочисленные значения. Это видно из приведенного ниже набора данных. mtcars — это встроенный набор данных, который собирает информацию о различных типах автомобилей. Мы можем импортировать его, используя mtcars, и проверить класс переменной mpg (миля на галлон). Он возвращает числовое значение, указывающее на непрерывную переменную.
dataset <- mtcars class(dataset$mpg)
Результат
## [1] "numeric"
Не каждый числовой столбец является действительно непрерывным. В одном и том же наборе данных столбец cyl содержит только 4, 6 и 8, а столбец am — только 0 и 1, поэтому обе категории случайно хранятся в виде чисел. Преобразование их с помощью функции factor() перед моделированием предотвращает обработку R промежутка между 4 и 6 цилиндрами как измеренной величины. Обратное действие, разделение непрерывного столбца на полосы, выполняется с помощью функции cut().
Уровни и метки факторов в R
Атрибут levels — это та часть фактора, на настройку которой вы потратите больше всего времени, поскольку он контролирует как выводимые значения, так и то, что модель будет считать базовым уровнем. Четыре базовых вспомогательных класса R охватывают практически все случаи.
| Функция | Что она делает | Типичное использование |
|---|---|---|
| уровни(f) | Считывает или заменяет названия уровней. | Преобразование сокращений в читаемые подписи. |
| nlevels(f) | Возвращает количество уровней | Проверка категории не привела к сбою после присоединения. |
| relevel(f, ref) | Перемещается на один уровень вперед | Выбор базового уровня для регрессии |
| уровни сброса(f) | Удаляет уровни с нулевым количеством наблюдений. | Очистка после выделения подмножества или фильтрации |
Приведенный ниже блок применяет все четыре фактора к цвету и полу, рассмотренным ранее.
# Inspect the levels of an existing factor levels(factor_color) # the level names, in the order R stored them nlevels(factor_color) # how many distinct levels exist # Rename the levels in place (the new vector must follow the same order) levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow') # Attach labels at creation time instead of renaming afterwards gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male')) # Make 'male' the reference level that modelling functions compare against gender_coded <- relevel(gender_coded, ref = 'male') # Remove levels that survived a subset but no longer occur in the data subset_color <- droplevels(factor_color[1:3])
Стоит помнить о двух моментах. Присваивание значения функции levels() переименовывает по позиции, поэтому несовпадающий вектор незаметно переименовывает не ту категорию. А подмножество сохраняет все исходные уровни до вызова функции droplevels(), поэтому фильтрация приводит к следующему результату. фрейм данных По-прежнему можно отображать пустые столбцы. этикетки Аргумент снова отличается: он присваивает имена уровням во время создания, а дублированные метки объединяют несколько входных значений в один уровень.
Как преобразовать фактор в числовой или символьный формат в R
Это самая распространённая ошибка, связанная с факторами в R. Поскольку фактор хранит целочисленные коды, вызов метода as.numeric() возвращает эти коды, а не значения, которые вы видите на экране. Фактор, содержащий годы с 2021 по 2023, возвращает значения 1, 2 и 3.
# A factor whose labels happen to look like numbers year_factor <- factor(c('2021', '2023', '2022', '2023')) # WRONG: this returns the internal codes 1, 3, 2, 3 - not the years as.numeric(year_factor) # RIGHT: read the label through the levels attribute first as.numeric(levels(year_factor))[year_factor] # Equivalent and easier to remember, but slightly slower as.numeric(as.character(year_factor)) # Back to plain text as.character(year_factor)
В базовой документации R рекомендуется использовать as.numeric(levels(f))[f] как правильный и немного более быстрый способ, а as.numeric(as.character(f)) — как более удобный для чтения эквивалент. Оба метода сначала считывают метку, а затем выполняют преобразование.
- Фактор характера: as.character(f) возвращает метки в виде обычного текста.
- Разложение на множители в целочисленные коды: as.integer(f) или unclass(f), когда код соответствует тому, что вам действительно нужно.
- Характер к фактору: factor(x) или более быстрый сокращенный вариант as.factor(x).
- Число к факторуfactor(x) для дискретных кодов, cut(x, breaks) для непрерывных значений, требующих группировки.
Ко всем этим механизмам применяется одна мера предосторожности. Если значение в x отсутствует в векторе levels, функция factor() устанавливает для этого элемента значение NA вместо того, чтобы вызывать ошибку, поэтому лишний пробел или разница в регистре могут незаметно удалить строки. Сравнение уникальных значений до и после преобразования, или сортировка фрейма данных Новая колонка быстро выявляет проблему.
Факторные, символьные и числовые значения в R: когда использовать каждый из них.
Выбор режима хранения на раннем этапе значительно упрощает последующую отладку. В таблице сравниваются три режима, которые может принимать столбец текста или кода.
| Свойства | фактор | Характер | Числовой |
|---|---|---|---|
| Сохранено как | Целочисленные коды плюс атрибут уровней | Струны | Doubleили целые числа |
| Фиксированный набор значений | Да, определяется уровнями. | Нет | Нет |
| Индивидуальный заказ на демонстрацию | Да, через уровни | Только в алфавитном порядке | Только числовое |
| Арифметический | Не положено | Не положено | Разрешено |
| Различия моделей | Создано автоматически | Сначала принудили | Рассматривается как измерение |
Использовать фактор Когда значения берутся из известного замкнутого списка, когда важен порядок отображения или ранжирования, или когда столбец используется для построения модели или легенды графика. персонаж Для свободного текста, идентификаторов и всего, что вы будете анализировать или объединять, например, имена, заметки и коды, которые постоянно поступают с новыми значениями. Используйте числовой только тогда, когда расстояние между двумя значениями имеет смысл.
В приведенном ниже блоке показаны самые быстрые способы проверить, что у вас на самом деле есть.
# Ask R what each column of a data frame actually is sapply(mtcars, class) # Direct membership tests is.factor(factor_day) is.ordered(factor_day) # unclass() exposes the integer codes hiding behind the labels unclass(factor_color)
Два правила помогают сделать правильный выбор. Запускайте sapply(df, class) после каждого импорта, потому что один лишний символ в числовом столбце превращает весь столбец в текст. И преобразуйте данные в фактор как можно позже, после очистки и объединения данных, чтобы дплир Объединения и фильтры по-прежнему сравнивают обычные строки, а не несовпадающие наборы уровней.
