2010-08-02 11 views
22

Ho un timeseries XTS in R del seguente formato e sto provando a fare un po 'di elaborazione, sottotitolazione e ri-organizzazione prima di esportare come CSV per lavorare in un altro programma.Come posso modificare XTS su data.frame e mantenere l'indice in 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 

e

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" 

E vorrei convertire questo ad un data.frame modo che io possa manipolare più facilmente e poi esportare in un altro programma. Tuttavia, quando uso test1 <- as.data.frame(master_1) il test1 ha Index (vale a dire le date e gli orari) visibile,

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 

ma l'indice non viene mostrato,

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

e scrivendo un csv write.csv(master_1, file="master_1.csv") non include l'ora o la data. Perché è questo e come posso includere i dati/dati temporali come una colonna, quindi è usato in altri comandi R ed esportato correttamente?

Grazie per qualsiasi aiuto.

risposta

35

Ecco perché le date sono nomi di ruolo nel tuo data.frame. Devi renderli una colonna separata.

Prova questo:

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

Questo è corretto. Per rispondere alla seconda domanda: 'write.csv' non include l'indice perché l'indice è un attributo xts * *, non un rowname. Usa invece 'write.zoo'. –

+0

Grazie Shane e Joshua, questo mi aiuta a capire dove ho sbagliato. – phrozenpenguin

+0

'' data.frame (date = index (master_1), value = coredata (master_1) [,]) '' per rinominare la variabile in un colpo solo. – PatrickT

1

Shane è giusto. potresti essere in cerca di indice (i tuoi xts). Ecco un esempio riproducibile.

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

Quindi dovresti essere in grado di esportarlo semplicemente in un csv. Ovviamente puoi anche rinominare le righe.

+0

eh, grazie Joshua quindi NON è un rowname :) –

+0

Grazie a ran2 per l'esempio. Posso anche usare rownames (x) se x non è un oggetto XTS. – phrozenpenguin

-2

Una forma elegante per cambiare XTS a data.frame:

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

Non c'è bisogno di 'as.matrix', e questo non risponde alla domanda:" scrivendo un csv 'write.csv (master_1, file =" master_1.csv ")' non include l'ora o la data. e come posso includere i dati/dati temporali come una colonna, quindi è usato in altri comandi R ed esportato correttamente? " – GSee

8

Questo è un po 'di una barra laterale, ma la funzione fortify(...) nel pacchetto ggplot2 convertirà una varietà di oggetti per frame di dati idonei per l'uso in ggplot(...), inclusi gli oggetti 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 

Quindi, se si sta già utilizzando gggplot questo è un modo semplice per farlo. Si noti che l'indice va in una colonna denominata Index ("I" maiuscola).

+0

Grazie alla tua risposta, sono riuscito a tracciare xts in ggplot2 http://stackoverflow.com/questions/35215579/how-to-plot-xts-in-ggplot2 – aelwan

5

Dal 1.9.6 È possibile convertire direttamente da/a xts senza perdere la classe di indice. Semplice come:

as.data.table(master_1) 

L'indice viene aggiunto come prima colonna nel risultato data.table, mantiene indice Date o POSIXct classi.

Problemi correlati