2016-06-09 4 views
2

Я нахожу манипулирование фактор-переменными в 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'). Но пока это не поддерживает согласование регулярных выражений.

+0

Что ты имеешь в виду «за один шаг»? – effel

+0

@effel Я предполагаю, что я думал о том, чтобы иметь одну строку, чтобы делать все, что можно было бы включить в команду lapply или аналогичную. Хотя я признаю, что это может быть достигнуто в R, все упаковывая в пользовательскую функцию. Я также задавался вопросом, не пропустил ли я команду из dplyr или другого пакета, который делает то, что делает «car :: recode», но с более дружественным синтаксисом. – JWilliman

ответ

0

Вот моя лучшая попытка.

xfactor <- function(x, replace = NULL, drop = FALSE, ignore.case = FALSE, ...) { 

    # Coerce to factor if not already (incorporating standard factor arguments) 
    if (!is.factor(x)) 
    x <- factor(x, ...) 

    if (!is.null(replace)) { 

    # Recode factor levels 
    if (!is.null(names(replace))) { 
     names(replace)[names(replace) == ""] <- replace[names(replace) == ""] 
     levels.tmp <- levels(x) 
     for(i in seq_along(replace)) 
     levels.tmp[grepl(replace[i], levels.tmp, ignore.case = ignore.case)] <- names(replace)[i] 
     levels(x) <- levels.tmp 
     replace <- names(replace) 
    } 

    # Reorder factor levels 
    if (drop == TRUE) 
     # Drop levels not included in replace statement 
     levels.new <- replace 
    else 
     # Reorder levels so those in replace statment come first 
     levels.new <- c(replace, setdiff(levels(x), replace)) 
    } 

    else 
    levels.new <- levels(x) 

    # Drop all levels listed in drop statement (converting vectors to regex expressions) 
    if (!is.logical(drop)) { 
    levels.new <- levels.new[!grepl(paste(drop, collapse = "|"), levels.new)]  
    } 

    # Output factor 
    return(factor(x, levels = levels.new)) 
} 

Создать пример фактор

x <- factor(c("dogfish", "rabbit","catfish", "mouse", "dirt")) 
levels(x) 
[1] "catfish" "dirt" "dogfish" "mouse" "rabbit" 

уровни фактора могут быть заказаны пропусканием неназванного вектора к КЕРЪАСУ. Уровни, не включенные в оператор замены, перемещаются в конец или отбрасываются.

xfactor(x, replace = c("mouse", "rabbit")) 
[1] dogfish rabbit catfish mouse dirt 
Levels: mouse rabbit catfish dirt dogfish 

xfactor(x, replace = c("mouse", "rabbit"), drop = TRUE) 
[1] <NA> rabbit <NA> mouse <NA> 
Levels: mouse rabbit 

Уровни факторов могут быть перекодированы, сведены и упорядочены путем передачи именованного вектора в оператор replace. Если имена векторов являются новыми уровнями факторов, а векторными значениями являются выражения регулярных выражений для старых уровней. Дублированные новые уровни будут свернуты.

xfactor(x, replace = c("Sea" = "fish", "Land" = "rab|mou")) 
[1] Sea Land Sea Land dirt 
Levels: Sea Land dirt  

уровни фактора могут быть удалены путем пропускания выражения регулярных выражений (или вектор) в раскрывающемся заявлении

xfactor(x, drop = "fish") 
[1] <NA> rabbit <NA> mouse dirt 
Levels: dirt mouse rabbit 

Функция будет работать в рамках других функций

library(dplyr) 
df <- data.frame(n = 1:5, x) 
df %>% 
    mutate(y = xfactor(x, replace = c("Sea" = "fish", "Land" = "rab|mou", "Air"), drop = "di")) 
    n  x y 
1 1 dogfish Sea 
2 2 rabbit Land 
3 3 catfish Sea 
4 4 mouse Land 
5 5 dirt <NA> 

 Смежные вопросы

  • Нет связанных вопросов^_^