2010-08-24 32 views
12

Tengo un problema al importar un archivo CSV con R:Leer csv con fechas y números de

líneas de ejemplo para importar:

2010-07-27;91 
2010-07-26;93 
2010-07-23;88 

que utilice la sentencia:

data <- read.csv2(file="...", sep=";", dec=".", header=FALSE) 

cuando intento agregar estos datos con otros generados por el análisis estadístico usando cbind, la fecha se muestra como un número entero porque se importó como factor.

Si trato de mostrarlo como una cadena usando as.character, los datos numéricos se transforman también en caracteres, por lo que no se pueden usar para procedimientos estadísticos.

Respuesta

7

Agregue as.is=TRUE a la llamada read.csv.

9

Quizás desee convertir los valores de caracteres en valores de tiempo significativos. En ese caso, los objetos de tiempo POSIXt son una buena opción.

Dado su archivo de datos, haría algo así como.

data <- read.table(file="...", sep = ";", as.is = TRUE) 
data[,1] <- strptime(data[,1], "%Y-%m-%d") 

Busque strptime en ayuda para obtener más detalles.

NOTA: Si va a especificar todas las propiedades del archivo simplemente use read.table. El único propósito para todas las otras versiones de read.xxx es simplificar la expresión porque se establecen los valores predeterminados. Aquí utilizó read.csv2 porque por defecto es sep = ';'. Por lo tanto, no lo especifique de nuevo. No tener que especificar eso es la razón completa por la que existe el comando. Personalmente, solo uso read.table porque nunca recuerdo los nombres/valores predeterminados de todas las variantes. En su caso, también es la llamada más breve porque satisface su encabezado y descifra los valores predeterminados.

+1

cuando corro su segunda línea, consigo un mensaje de error como 'proporcionó 9 variables para reemplazar 1 variables'. Sin embargo, cuando envuelvo 'strptime' en' as.POSIXct (...) ', es decir' as.POSIXct (strptime (data [, 1], "% Y-% m-% d") 'parece –

+0

Si los datos [, 1] son ​​un vector de cadenas de caracteres del formato c ("2010-07-23", ...) lo que escribí funciona. ¿Qué significa "parece que funciona" de todos modos? como si estuvieras simplemente convirtiendo el resultado POSIXlt predeterminado y tienes alguna otra función que no se menciona aquí usando un valor POSIXlt. Está bien, es solo un resultado diferente. Eso no significa que lo que hay allí no funciona. POSIXlt y POSIXct son de la clase POSIXt (que es la que mencioné). – John

+1

Esto es precisamente lo que * 'read.csv (... colClasses ...)' * es para! Ver la respuesta de Marek. Hacer la conversión en tiempo de lectura con colClasses es mejor que esta respuesta porque no desperdicia mucha memoria temporal. (Simplemente haz * 'gc (reset = TRUE)' * después). Además, es mucho más legible. – smci

25

Uso colClasses argumento:

data <- read.csv2(file="...", sep=";", dec=".", header=FALSE, 
    colClasses=c("Date",NA)) 

NA significa "proceder como predeterminado"

Después de la importación podría convertir factor a Date por

data[[1]] <- as.Date(data[[1]]) 
Cuestiones relacionadas