Возможно, тупой вопрос, но я недавно заметил, что 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()
?
Зачем использовать as.factor() вместо просто factor()
Ответ 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