2013-03-20 15 views
9

Uso i fattori in modo raro e in genere li trovo comprensibile, ma spesso sono sfocato sui dettagli per operazioni specifiche. Attualmente sto codificando/comprimendo categorie con poche osservazioni in "altro" e sto cercando un modo rapido per farlo - ho forse 20 livelli di una variabile, ma sono interessato a farne crollare un po 'a uno.R: livelli dei fattori, ricodifica a riposo su "altro"

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) 

)

Qui sono i miei livelli di interesse, e le relative etichette in vettori separati.

#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') 

ho potuto utilizzare la chiamata factor(), tutti enumerare, classificare come "altro" per ogni volta una categoria ha avuto alcune osservazioni.

Supponendo che il 'top8' e 'top8_desc' sopra siano i primi 8 effettivi, qual è il modo migliore per dichiarare i dati $ naics come variabile fattore e ricodificare tutto il resto come 'altro'?

risposta

6

Penso che il modo più semplice sia quello di ricollocare tutti i valori non compresi tra i primi 8 in un valore speciale.

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

Quindi è possibile utilizzare l'opzione "escludere" quando trasformandolo in un fattore

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

Hm, che coinvolge i dati in realtà buttare via al contrario di cambiare la categorizzazione ma questo è probabilmente ciò che la codifica come fattore ha comunque in primo luogo. Suppongo che non importi più di tanto. – ako

+1

È sempre possibile creare una colonna aggiuntiva nel dataframe con i codici trasformati. – kith

+1

Ho provato questa variazione della tua risposta: 'livelli (dati $ naics) [che (! Livelli (dati $ naics)% in% top8)] <-" altro "' – ako

0

ho writen una funzione per fare questo che può essere utile per gli altri può essere? Prima controllo in modo relativo, se un livello si verifica meno della percentuale di Mp della base. Dopo di che controllo per limitare il numero massimo di livelli da ml.

ds è il set di dati disponibile di tipo data.frame, lo faccio per tutte le colonne visualizzate in cat_var_names come fattori.

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

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). – Sliq

3

Un ingresso tardivo

Qui è un wrapper per plyr::mapvalues che permette al un argomento remaining (il vostro 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) 
Problemi correlati