2013-03-20 20 views
9

Używam czynników dość rzadko i generalnie uważam je za zrozumiałe, ale często jestem niewyraźny odnośnie szczegółów konkretnych operacji. Obecnie koduję/zwijam kategorie z kilkoma obserwacjami w "inne" i szukam szybkiego sposobu na zrobienie tego - mam 20 poziomów zmiennej, ale jestem zainteresowany zawaleniem ich na jeden.R: poziomy współczynników, reszta reszty na "inne"

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) 

)

Oto moje poziomy zainteresowania, a ich etykiety w oddzielnych wektorach.

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

mogę użyć połączenia factor(), wymienić je wszystkie, klasyfikowanie jako „inne” za każdym razem kategoria miał kilka uwag.

Zakładając, że "top8" i "top8_desc" powyżej są rzeczywistymi top 8, jaki jest najlepszy sposób deklarowania danych $ naics jako zmiennej czynnikowej i przekodowywania wszystkiego jako "innego"?

Odpowiedz

6

Wydaje mi się, że najłatwiej jest zmienić nazwę naikliny, która nie znajduje się w pierwszej ósemce, na specjalną wartość.

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

Następnie można skorzystać z opcji „wykluczenie”, gdy obracając ją w czynnik

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

Hm, że wiąże się rzeczywiście rzucają dane z dala, w przeciwieństwie do zmieniających kategoryzację , ale to prawdopodobnie przede wszystkim kodowanie jako czynnik. Przypuszczam, że to nie ma znaczenia. – ako

+1

Zawsze można utworzyć dodatkową kolumnę w ramce danych z przekształconymi kodami. – kith

+1

Próbowałem tej odmiany twojej odpowiedzi: 'levels (data $ naics) [which (! Levels (data $ naics)% in% top8)] <-" other "' – ako

0

mam napisane funkcję do tego, które mogą być przydatne dla innych może zrobić? Najpierw sprawdzam względnie, jeśli poziom występuje mniej niż procent procentowy bazy. Potem sprawdzam, czy maksymalna liczba poziomów to ml.

ds jest zbiorem danych pod ręką typu data.frame, robię to dla wszystkich kolumn, które pojawiają się w cat_var_names jako czynniki.

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

Nie daje to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, zostaw komentarz pod swoim postem - zawsze możesz komentować swoje posty, a gdy już masz wystarczającą [reputację] (http://stackoverflow.com/help/whats-reputation), być w stanie [komentować dowolny wpis] (http://stackoverflow.com/help/privileges/comment). – Sliq

3

Późne wejście

Tutaj jest opakowaniem dla plyr::mapvalues który umożliwia remaining argument (Twój 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) 
Powiązane problemy