Фактор R: категориальная переменная и непрерывные переменные

⚡ Умное резюме

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

  • 🏷️ Конструкция: Фактор содержит целочисленные коды плюс атрибут уровней, поэтому каждая категория проверяется на соответствие фиксированному списку.
  • 🧩 Создание: Функция factor() преобразует символьный вектор, а функция class() подтверждает, что результат изменился с символьного на факторный.
  • 🔘 Номинальный: Без аргумента levels R сортирует категории самостоятельно, поэтому ранжирование по цветам или полу не подразумевается.
  • 📊 Порядковый номер: Передача параметра ordered = TRUE с явным указанием вектора уровней фиксирует ранжирование от самого низкого к самому высокому.
  • 🔢 Непрерывный: Числовые и целочисленные столбцы по умолчанию остаются непрерывными, как показано в примере class(mtcars$mpg).
  • ⚠️ Ловушка конверсии: Метод `as.numeric()` для фактора возвращает коды уровней, поэтому сначала прочитайте метку с помощью метода `levels()`.
  • ???? Обслуживание: Функция relevel() устанавливает базовый уровень модели, а функция droplevels() очищает категории, оставшиеся после удаления подмножества.

Учитывайте категориальные и непрерывные переменные в R.

Что такое фактор в 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) после каждого импорта, потому что один лишний символ в числовом столбце превращает весь столбец в текст. И преобразуйте данные в фактор как можно позже, после очистки и объединения данных, чтобы дплир Объединения и фильтры по-прежнему сравнивают обычные строки, а не несовпадающие наборы уровней.

Часто задаваемые вопросы (FAQ)

Если параметр levels не указан, функция factor() вызывает unique() и сортирует значения в порядке возрастания. Эта сортировка зависит от активной локали, поэтому она не всегда соответствует обычному ASCII-коду. Указывайте аргумент levels явно, если порядок имеет значение.

Функция `table(f))` возвращает именованный счетчик для каждого уровня, а `prop.table(table(f))` преобразует эти счетчики в пропорции. Обе функции позволяют отображать пустые уровни, что полезно для выявления категорий, исчезнувших после фильтрации. фрейм данных.

Функция factor() сопоставляет каждый элемент с указанными вами уровнями, и любое значение, не находящееся в совпадении, становится NA вместо того, чтобы вызывать ошибку. Перед преобразованием проверьте setdiff(unique(x), your_levels) и обратите внимание на наличие лишних пробелов или различий в регистре букв в исходных данных.

Функция `cut()` разделяет числовой вектор по заданным точкам разрыва и возвращает коэффициент. Передайте метки для удобочитаемых названий полос и `ordered_result = TRUE`, если полосы ранжируются. Функция `findInterval()` — более быстрая альтернатива, если нужен только индекс интервала.

Начиная с версии R 4.0.0, значение по умолчанию для data.frame() и read.csv() при сбросе настроек — stringsAsFactors = FALSE, поэтому текстовые столбцы остаются символьными. Более старые скрипты, которые полагались на автоматическое преобразование, теперь должны явно вызывать factor() для столбцов, которые они моделируют.

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

Большинство функций моделирования принимают факторы напрямую и автоматически создают фиктивные контрасты, в то время как многие другие... машинного обучения или Пакеты ожидают числовую матрицу. Функция model.matrix() или one-hot кодирование устраняют этот пробел, и упорядоченный фактор может сохранить свой ранжированный вид.

Да. Второй пилот GitHub Работает в RStudio 2023.09.0 и более поздних версиях и предлагает варианты автозавершения на основе комментариев и кода в открытом файле. Порядок уровней и обработку значений NA следует рассматривать как предложения для проверки, а не как факты.

Подведем итог этой публикации следующим образом: