Подтвердить что ты не робот

Зачем использовать as.factor() вместо просто factor()

Возможно, тупой вопрос, но я недавно заметил, что Matt Dowle написал код as.factor(), а именно for (col in names_factors) set(dt, j=col, value=as.factor(dt[[col]])) в комментарии к этому ответу. Я использовал этот фрагмент, но мне нужно было явно установить уровни факторов, поэтому мне пришлось изменить as.factor(dt[[col]]) на factor(dt[[col]], levels=my_levels). Это заставило меня задуматься, что (если есть) является преимуществом использования as.factor() по сравнению с просто factor()?

4b9b3361

Ответ 1

as.factor является оберткой для factor, но позволяет быстро возвращать, если входной вектор уже является фактором:

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: Указание очевидного здесь, но: это не просто оболочка, так как этот "быстрый возврат" оставит только уровни факторов и упорядоченность а factor() не будет:

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