¡Todo depende de la pregunta que haga sobre los datos!
type.c <- c("debit", "debit", "credit")
type.f <- factor(type.c)
Aquí type.c es sólo una lista de cadenas de caracteres, mientras que type.f es una lista de factores (si esto es correcto, o es una matriz?)
storage.mode(type.c)
# [1] "character"
storage.mode(type.f)
# [1] "integer"
cuando un factor variable es creada se ve a través de todos los valores que se han especificado y crea los "niveles" ... tiene una oportunidad única:
levels(type.f)
# [1] "credit" "debit"
Entonces, en lugar de almacenar las cadenas de caracteres "débito" "crédito" "mis -spelt debbit "etc ... simplemente almacena es el número entero junto con los niveles ... echar un vistazo a:
str(type.f)
# Factor w/ 2 levels "credit","debit": 2 2 1
es decir, en type.c dice c ("débito", "débito", "crédito") y niveles (type.f) dice "crédito" "débito", verá que str (type.f) comienza a enumerar los primeros valores tal como están almacenados, es decir, 2 2 1 ...
Si escribe mal "debitar" y agregar a la lista, y luego haga un nivel (type.f) lo verá como un nuevo nivel ... de lo contrario podría hacer la tabla (type.c).
Cuando solo hay tres elementos en la lista, no importa mucho el volumen de almacenamiento, pero a medida que la lista se alarga, se iniciará "crédito" (6 caracteres) y "cargo" (5 caracteres) ocupa mucho más espacio de almacenamiento que los 4 bytes necesarios para contener un número entero (más el par de bytes). Un pequeño experimento muestra que para un conjunto de type.c seleccionado al azar, el umbral en object.size (type.c)> object.size (type.f) es de aproximadamente 96 elementos.
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')
Disculpas por la falta de R'ness ya que pensé que ayudaría con la claridad.
"Es útil usar' stringsAsFactors = TRUE' al leer datos de .csv o .txt usando 'read.table' o' read.csv'. " Tengo curiosidad de por qué? Si "a menudo es más fácil dejar las variables de factores como vectores de caracteres", ¿por qué querría hacer lo opuesto al importar un marco de datos? – landroni
Debería ser stringsAsFactors = FALSE. He arreglado el texto. Gracias por las preguntas –