Я нахожу манипулирование фактор-переменными в R чрезмерно сложным. Вещи, которые я часто хочу делать, когда очистка факторы включают в себя:Уровни перекодировки, коллапса и коэффициента заказа с использованием одной функции с совпадением регулярных выражений
- Прибегая уровней - не просто установить ссылку категории, но и поставить все уровни в логическом (не алфавитном порядке) для сводных таблиц.
x <- factor(x, levels = new.order)
Уровни перекодировки/переименования - упрощение имен и/или сворачивание нескольких категорий в одну группу. Для взаимно-однозначной перекодировки
levels(x) <- new.levels(x)
илиplyr::revalue
, см. here или here.car::recode
может выполнять несколько совпадений один-ко-многим в одном выражении, но не поддерживает сопоставление регулярных выражений.Уровни падения - не просто падение неиспользуемых уровней, но установка некоторых уровней на отсутствие. (Например, с кодами ошибок).
x <- factor(as.character(x), exclude = drop.levels)
- Добавить уровни - показать категории с нулевым количеством отсчетов.
Что было бы здорово, чтобы иметь одну функцию, которая может сделать все вышеперечисленное сразу, позволяет нечеткому (регулярное выражение) соответствие для перекодирования и сбросив факторы, может быть использован в других функциях (например. lapply
или dplyr::mutate
) и имеет простой (последовательный) синтаксис.
Я опубликовал свою лучшую попытку на этом в качестве ответа ниже, но, пожалуйста, дайте мне знать, если я пропустил функцию, которая уже существует или код может быть улучшен.
EDIT
Я осведомлен о forcats
пакета, который подзаголовком Инструменты для работы с категориальными переменными (факторами). В пакете есть много вариантов для использования уровней ('fct_infreq', 'fct_reorder', 'fct_relevel', ...), уровни перекодировки/группировки ('fct_recode', 'fct_lump', 'fct_collapse'), уровни сброса ('fct_recode') и добавление уровней ('fct_expand'). Но пока это не поддерживает согласование регулярных выражений.
Что ты имеешь в виду «за один шаг»? – effel
@effel Я предполагаю, что я думал о том, чтобы иметь одну строку, чтобы делать все, что можно было бы включить в команду lapply или аналогичную. Хотя я признаю, что это может быть достигнуто в R, все упаковывая в пользовательскую функцию. Я также задавался вопросом, не пропустил ли я команду из dplyr или другого пакета, который делает то, что делает «car :: recode», но с более дружественным синтаксисом. – JWilliman