2013-03-20 15 views
9

Ich benutze Faktoren etwas selten und finde sie allgemein verständlich, aber ich bin oft über die Details für spezifische Operationen unscharf. Momentan kodiere/kollabiere ich Kategorien mit wenigen Beobachtungen in "andere" und suche nach einem schnellen Weg, um das zu tun - ich habe vielleicht 20 Stufen einer Variablen, bin aber daran interessiert, einen Haufen von ihnen zu einem zusammenzufassen.R: Faktorstufen, Rest auf 'andere' umrechnen

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) 

)

Hier sind meine Ebene von Interesse und ihre Etiketten in getrennten Vektoren.

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

konnte ich den factor() Aufruf verwenden, aufzuzählen, sie alle als „andere“ für jedes Mal, wenn eine Kategorie hatte wenige Beobachtungen zu klassifizieren.

Unter der Annahme, dass die 'top8' und 'top8_desc' oben sind die Top 8, was ist der beste Weg, um Daten $ Naics als eine Faktorvariable zu deklarieren und alles andere als 'andere' zu rekodieren?

Antwort

6

Ich denke, der einfachste Weg ist, alle Naics, die nicht in den Top 8 sind, auf einen speziellen Wert umzubenennen.

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

Dann können Sie die „ausschließen“ Option verwenden, wenn es in einen Faktor drehen

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

Hm, das die Kategorisierung zu ändernden im Gegensatz zu werfen Daten weg beinhaltet tatsächlich erlaubt , aber das ist wahrscheinlich das, was die Codierung als Faktor überhaupt erst macht. Ich nehme an, es ist nicht so wichtig. – ako

+1

Sie können immer eine zusätzliche Spalte im Datenrahmen mit den transformierten Codes erstellen. – kith

+1

Ich versuchte diese Variante Ihrer Antwort: 'Ebenen (Daten $ Naics) [welche (! Ebenen (Daten $ Naics)% in% top8)] <-" andere "' – ako

0

ich eine Funktion writen haben, dies zu tun, die für andere nützlich sein können sein kann? Ich checke zunächst relativ ein, wenn ein Level weniger als mp Prozent der Base erreicht. Danach überprüfe ich, um die maximale Anzahl der Level auf ml zu begrenzen.

ds ist der Datensatz vom Typ data.frame, ich tue dies für alle Spalten, die in cat_var_names als Faktoren erscheinen.

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

Dies bietet keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren, und sobald du genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) hast, wirst du das tun in der Lage sein [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment). – Sliq

3

Eine Nachmeldung

Dies ist ein Wrapper für plyr::mapvalues, die das ein remaining Argument (Ihre 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) 
Verwandte Themen