2016-09-01 3 views
20

Möglicherweise eine dumme Frage, aber ich sah kürzlich Matt Dowle Code mit as.factor() schreiben, speziell for (col in names_factors) set(dt, j=col, value=as.factor(dt[[col]])) in einem Kommentar zu this answer. Ich benutzte dieses Snippet, aber ich musste die Faktorstufen explizit einstellen, also musste ich as.factor(dt[[col]]) zu factor(dt[[col]], levels=my_levels) ändern. Das hat mich denken lassen, was (wenn überhaupt) ist der Vorteil, as.factor() gegenüber nur factor() zu verwenden?Warum as.factor() anstelle von nur factor() verwenden

+4

Namenskonsistenz ist ein großes. Fast alle gängigen Klassen haben eine 'as.class' Funktion. – Gregor

Antwort

21

as.factor ist ein Wrapper für factor, aber es ermöglicht eine schnelle Rückkehr an, wenn der Eingangsvektor bereits ein Faktor ist:

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: das Offensichtliche hier Angabe, aber: es ist nicht nur ein Wrapper ist , da diese "schnelle Rückkehr" Faktorstufen und Ordnungsneigung verlässt, während factor() nicht:

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 
Verwandte Themen