Все зависит от того, на какой вопрос вы запрашиваете данные!
type.c <- c("debit", "debit", "credit")
type.f <- factor(type.c)
Здесь type.c это просто список символьных строк, в то время как type.f список факторов (это правильно? Или это массив?)
storage.mode(type.c)
# [1] "character"
storage.mode(type.f)
# [1] "integer"
когда фактор переменный создаются он просматривает все значения, которые были даны и создают «уровни» ... есть быстрый взгляд на:
levels(type.f)
# [1] "credit" "debit"
Тогда вместо того, чтобы хранить строки символов «дебет», «кредит» «неверные -spelt debbit "и т. д. i т просто хранит целое вместе с уровнями ... посмотреть на:
str(type.f)
# Factor w/ 2 levels "credit","debit": 2 2 1
т.е. в type.c он говорит с («дебет», «дебет», «кредит») и уровней (типа .f) говорит «кредит» «дебет», вы видите, что str (type.f) начинает перечислять первые несколько значений при их сохранении, т. е. 2 2 1 ...
Если вы неправильно написали «debbit», и добавьте его в список, а затем выполните уровни (type.f), вы увидите его как новый уровень ... иначе вы могли бы сделать таблицу (type.c).
Когда в списке всего три элемента, это не имеет большого значения для объема хранилища, но по мере того, как ваш список будет длиннее, начнется «кредит» (6 символов) и «дебет» (5 символов) занимают гораздо больше памяти, чем 4 байта, которые требуется для хранения целого числа (плюс пара байтов). Небольшой эксперимент показывает, что для случайно выбранного набора типа.c пороговое значение для object.size (type.c)> object.size (type.f) составляет около 96 элементов.
dc <- c("debit", "credit")
N <- 300
# lets store the calculations as a matrix
# col1 = n
# col2 = sizeof(character)
# col3 = sizeof(factors)
res <- matrix(ncol=3, nrow=N)
for (i in c(1:N)) {
type.c <- sample(dc, i, replace=T)
type.f <- factor(type.c)
res[i, 1] <- i
res[i, 2] <- object.size(type.c)
res[i, 3] <- object.size(type.f)
cat('N=', i, ' object.size(type.c)=',object.size(type.c), ' object.size(type.f)=',object.size(type.f), '\n')
}
plot(res[,1], res[,2], col='blue', type='l', xlab='Number of items in type.x', ylab='bytes of storage')
lines(res[,1], res[,3], col='red')
mtext('blue for character; red for factor')
cat('Threshold at:', min(which(res[,2]>res[,3])), '\n')
Извинения за недостаток R'ness, поскольку я думал, что это поможет с ясностью.
«Полезно использовать' strAsAsFactors = TRUE' при чтении данных из .csv или .txt с использованием 'read.table' или' read.csv'. Мне любопытно, почему? Если «часто проще оставить фактор-переменные в качестве символьных векторов», то почему вы хотите сделать обратное при импорте фрейма данных? – landroni
Это должны быть строкиAsFactors = FALSE. Я исправил текст. Спасибо за вопросы. –