2012-02-20 12 views
8

Stata tiene un comando llamado compress que examina todas las filas de datos e intenta forzar cada una de ellas al formato más eficiente. Por ejemplo, si tiene un grupo de enteros almacenados como un vector de caracteres dentro de un data.frame, lo forzará a un entero.R equivalente al comando `compress` de Stata?

Me imagino cómo se podría escribir una función de este tipo en R, pero ¿ya existe?

+2

Sería fácil escribir código que verificara el entero y forzaría si alguna fracción de valores especificada no fuera NA, pero creo que la respuesta general es "no". –

+0

Eso fue mi pensamiento también. El truco sería escribir un código eficiente para que no tardara una eternidad en ejecutarse. Regexes sería la forma obvia de comenzar, pero podría ser demasiado lento. –

+0

Si tuviera que probar el uso de la longitud (niveles (factor()) y convertir al factor si ese valor fuera inferior al 20% de la longitud del vector, también podría ahorrar espacio. Del mismo modo, podría verificar para ver qué fracción del vector, vrc, tenía valores == trunc (vec) podría ser una prueba de si sería coercitivo forzar un valor numérico a entero. No vi mucha aplicabilidad de los métodos de expresión regular, pero tal vez soy obtuso otra vez. –

Respuesta

8

Técnicamente, read.table hace exactamente eso con la ayuda de type.convert. Lo que podría utilizar eso - no es la manera más eficiente, pero probablemente el más fácil:

df <- as.data.frame(lapply(df ,function(x) type.convert(as.character(x)))) 

En la práctica puede ser mejor que hacer que selectivamente, sin embargo, por lo que sólo toca caracteres/factores:

for (i in seq.int(df)) if (is.factor(df[[i]]) || is.character(df[[i]])) 
    df[[i]] <- type.convert(as.character(df[[i]]))