2016-09-01 12 views
20

Prawdopodobnie głupie pytanie, ale ostatnio widziałem Matt Dowle napisać kod z as.factor(), w szczególności for (col in names_factors) set(dt, j=col, value=as.factor(dt[[col]])) w komentarzu do this answer. Użyłem tego fragmentu, ale musiałem wyraźnie ustawić poziomy czynników, więc musiałem zmienić as.factor(dt[[col]]) na factor(dt[[col]], levels=my_levels). To dało mi do myślenia, co (jeśli w ogóle) jest korzyści z używania as.factor() versus tylko factor()?Dlaczego używać as.factor() zamiast tylko czynnik()

+4

Naming konsystencja jest duży. Prawie wszystkie popularne klasy mają funkcję 'as.class'. – Gregor

Odpowiedz

21

as.factor jest opakowaniem dla factor, ale pozwala na szybki powrót Jeśli wektor wejściowy jest już czynnikiem:

function (x) 
{ 
    if (is.factor(x)) 
     x 
    else if (!is.object(x) && is.integer(x)) { 
     levels <- sort(unique.default(x)) 
     f <- match(x, levels) 
     levels(f) <- as.character(levels) 
     if (!is.null(nx <- names(x))) 
     names(f) <- nx 
     class(f) <- "factor" 
     f 
    } 
else factor(x) 
} 

Per @Frank: rzeczy oczywiste tutaj, ale: to nie jest zwykły wrapper , od tego „szybkiego powrotu” pozostawi poziom czynnika i nakazał-ności, sam natomiast factor() nie będzie:

f = factor("a", levels=c("a","b")) 
#[1] a 
#Levels: a b 

factor(f) 
#[1] a 
#Levels: a 

as.factor(f) 
#[1] a 
#Levels: a b 
Powiązane problemy