2010-08-02 61 views
22

Tengo una serie de tiempo XTS en R del siguiente formato y estoy tratando de hacer algún procesamiento, subconjunto y reorganización antes de exportarlo como un CSV para trabajar en otro programa.¿Cómo puedo cambiar XTS a data.frame y mantener el índice en R?

head(master_1) 
        S_1 
2010-03-03 00:00:00 2.8520 
2010-03-03 00:30:00 2.6945 
2010-03-03 01:00:00 2.5685 
2010-03-03 01:30:00 2.3800 
2010-03-03 02:00:00 2.2225 
2010-03-03 02:30:00 2.0650 

y

str(master_1) 
An ‘xts’ object from 2010-03-03 to 2010-05-25 08:30:00 containing: 
    Data: num [1:4000, 1] 2.85 2.69 2.57 2.38 2.22 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr "S_1" 
    Indexed by objects of class: [POSIXt,POSIXct] TZ: 
    Original class: 'zoo' 
    xts Attributes: 
List of 1 
$ dateFormat: chr "Date" 

Y me gustaría convertir esto en un hoja.de.datos para que pueda manipularlo más fácilmente y luego exportar a otro programa. Sin embargo, cuando uso test1 <- as.data.frame(master_1) el test1 tiene el índice (es decir, las fechas y horas) visibles,

head(test1) 
         S_1 
2010-03-03 00:00:00 2.8520 
2010-03-03 00:30:00 2.6945 
2010-03-03 01:00:00 2.5685 
2010-03-03 01:30:00 2.3800 
2010-03-03 02:00:00 2.2225 
2010-03-03 02:30:00 2.0650 

pero el índice no está demostrado,

str(test1) 
'data.frame': 4000 obs. of 1 variable: 
$ S_1: num 2.85 2.69 2.57 2.38 2.22 ... 

y escribir un csv write.csv(master_1, file="master_1.csv") no incluye la hora o la fecha. ¿Por qué es esto y cómo puedo incluir los datos de datos/tiempo como una columna, por lo que se usa en otros comandos R y se exporta correctamente?

Gracias por cualquier ayuda.

Respuesta

35

Eso es porque las fechas son rownames en su data.frame. Necesitas hacer una columna separada.

Prueba esto:

data.frame(date=index(master_1), coredata(master_1)) 
+0

Esto es correcto. Para responder a la segunda pregunta: 'write.csv' no incluye el índice porque el índice es un atributo xts *, no un nombre de fila. Use 'write.zoo' en su lugar. –

+0

Gracias Shane y Joshua, eso me ayuda a ver dónde he estado yendo mal. – phrozenpenguin

+0

'' data.frame (date = index (master_1), value = coredata (master_1) [,]) '' para cambiar el nombre de la variable de una vez. – PatrickT

1

Shane es correcto. es posible que esté buscando el índice (su xts). Aquí hay un ejemplo reproducible.

library(xts) 
example(xts) 
x = head(sample.xts) 
datefield = index(x) 
newdf = data.frame(x,datefield) 

Entonces usted debe ser capaz de simplemente exportar a un archivo CSV. Por supuesto, también puedes cambiar el nombre de las filas.

+0

eh, gracias Joshua, así que NO es un nombre de fila :) –

+0

Gracias ran2 para el ejemplo. También puedo usar rownames (x) si x no es un objeto XTS. – phrozenpenguin

-2

Una forma elegante para cambiar XTS a data.frame:

myDF <- as.data.frame(as.matrix(myXTS)) 
+0

No es necesario 'as.matrix', y esto no responde a la pregunta:" escribir un csv 'write.csv (master_1, file =" master_1.csv ")' no incluye la hora o la fecha. y ¿cómo puedo incluir los datos de datos/tiempo como una columna, por lo que se utilizan en otros comandos R y se exportan correctamente? " – GSee

8

Esto es un poco de una barra lateral, pero la función fortify(...) en paquete ggplot2 convertirá una variedad de objetos para tramas de datos adecuados para uso en ggplot(...), incluidos los objetos xts.

library(xts) 
set.seed(1) # for reproducible example 
master_1 <- xts(rnorm(10,mean=2,sd=0.1),as.POSIXct("2010-03-03")+30*(0:9)) 

library(ggplot2) 
df <- fortify(master_1) 
head(df) 
#     Index master_1 
# 1 2010-03-03 00:00:00 1.937355 
# 2 2010-03-03 00:00:30 2.018364 
# 3 2010-03-03 00:01:00 1.916437 
# 4 2010-03-03 00:01:30 2.159528 
# 5 2010-03-03 00:02:00 2.032951 
# 6 2010-03-03 00:02:30 1.917953 

Así que si usted ya está usando gggplot esta es una manera fácil de hacerlo. Tenga en cuenta que el índice va a una columna llamada Index (capital "I").

+0

Gracias a su respuesta, logré trazar xts en ggplot2 http://stackoverflow.com/questions/35215579/how-to-plot-xts-in-ggplot2 – aelwan

5

Desde 1.9.6 Puede convertir directamente desde/a xts sin perder la clase de índice. Tan simple como:

as.data.table(master_1) 

Se añade el índice como la primera columna en el resultado data.table, conserva índice Date o POSIXct clases.

Cuestiones relacionadas