2013-03-20 2 views
9

Я использую факторы несколько нечасто и, как правило, считаю их понятными, но я часто нечетко описываю детали для конкретных операций. В настоящее время я кодирую/сворачиваю категории с небольшим количеством наблюдений в «другие», и я ищу быстрый способ сделать это - у меня есть, возможно, 20 уровней переменной, но я заинтересован в том, чтобы свести их кучу к одному.R: уровни факторов, перекодировка на «другие»

data<-data.frame(employees=sample.int(1000,500), 
     naics=sample(c('621111','621112','621210','621310','621320','621330','621340','621391','621399','621410','621420','621491','621492','621493','621498','621511','621512','621610','621910','621991','621999'),100,replace=T) 

)

Вот мои уровни интереса, и их метки в отдельных векторах.

#levels and labels 
top8 <-c('621111','621210','621399','621610','621330','621310','621511','621420','621320') 
top8_desc <- c('Offices of physicians', 
      'Offices of dentists', 
      'Offices of all other miscellaneous health practitioners', 
      'Home health care services', 
      'Offices of Mental Health Practitioners', 
      'Offices of chiropractors', 
      'Medical Laboratories', 
      'Outpatient Mental Health and Substance Abuse Centers', 
      'Offices of optometrists') 

Я мог бы использовать factor() вызов, перечислить их все, классификации, как «другой» каждый раз категории было несколько замечаний.

Предполагая, что вершины 'top8' и 'top8_desc' являются фактическим верхним 8, что является лучшим способом объявить данные $ naics как факторную переменную и переделать все остальное как "другое"?

ответ

6

Я думаю, что самый простой способ - переклассифицировать все наивности не в верхнем 8 специальном значении.

data$naics[!(data$naics %in% top8)] = -99 

Затем вы можете использовать опцию «исключить» при повороте его в фактор

factor(data$naics, exclude=-99) 
+1

Hm, который включает в себя фактически метательные данные прочь, в отличие от изменения категоризации , но это, вероятно, то, что кодирование как фактор все равно в первую очередь. Полагаю, это не имеет большого значения. – ako

+1

Вы всегда можете сделать дополнительный столбец в dataframe с преобразованными кодами. – kith

+1

Я пробовал эту вариацию вашего ответа: 'levels (data $ naics) [которые (! Уровни (данные $ naics)% in% top8)] <-" other "' – ako

0

Я прописан функцию, чтобы сделать это, что может быть полезным для других может быть? Я сначала проверяю относительную манеру, если уровень составляет менее mp процентов базы. После этого я проверяю ограничение максимального количества уровней на мл.

ds - это набор данных под рукой типа data.frame, я делаю это для всех столбцов, которые отображаются в cat_var_names как факторы.

cat_var_names <- names(clean_base[sapply(clean_base, is.factor)]) 

recodeLevels <- function (ds = clean_base, var_list = cat_var_names, mp = 0.01, ml = 25) { 
    # remove less frequent levels in factor 
    # 
    n <- nrow(ds) 
    # keep levels with more then mp percent of cases 
    for (i in var_list){ 
    keep <- levels(ds[[i]])[table(ds[[i]]) > mp * n] 
    levels(ds[[i]])[which(!levels(ds[[i]])%in%keep)] <- "other" 
    } 

    # keep top ml levels 
    for (i in var_list){ 
    keep <- names(sort(table(ds[i]),decreasing=TRUE)[1:ml]) 
    levels(ds[[i]])[which(!levels(ds[[i]])%in%keep)] <- "other" 
    } 
    return(ds) 
} 
+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). – Sliq

3

Поздний вход

Вот обертка для plyr::mapvalues, которая позволяет remaining аргумент (ваш other)

library(plyr) 

Mapvalues <- function(x, from, to, warn_missing= TRUE, remaining = NULL){ 
    if(!is.null(remaining)){ 
    therest <- setdiff(x, from) 
    from <- c(from, therest) 
    to <- c(to, rep_len(remaining, length(therest))) 
    } 
    mapvalues(x, from, to, warn_missing) 
} 
# replace the remaining values with "other" 
Mapvalues(data$naics, top8, top8_desc,remaining = 'other') 
# leave the remaining values alone 
Mapvalues(data$naics, top8, top8_desc) 
Смежные вопросы