2010-08-02 12 views
22

J'ai une timeseries XTS dans R du format suivant et j'essaie de faire un peu de traitement, de sous-ensemble et de réarrangement avant d'exporter en CSV pour travailler dans un autre programme.Comment puis-je changer XTS pour data.frame et garder Index dans 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 

et

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" 

Et je voudrais convertir en un data.frame afin que je puisse le manipuler plus facilement, puis exporter vers un autre programme. Cependant, quand j'utilise test1 <- as.data.frame(master_1) l'épreuve1 a le indice (à savoir les dates et heures) 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 

Mais l'indice est non représentée,

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

Et écrire un csv write.csv(master_1, file="master_1.csv") ne comprend pas l'heure ou la date. Pourquoi est-ce, et comment puis-je inclure les données de données/temps en tant que colonne, de sorte qu'il est utilisé dans d'autres commandes R et exporté correctement?

Merci pour toute aide.

Répondre

35

C'est parce que les dates sont des noms usés dans votre data.frame. Vous devez en faire une colonne séparée.

Essayez ceci:

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

Ceci est correct. Pour répondre à la deuxième question: 'write.csv' n'inclut pas l'index car l'index est un attribut * xts *, pas un nom de base. Utilisez 'write.zoo' à la place. –

+0

Merci Shane et Joshua, ça m'aide à voir où je me trompe. – phrozenpenguin

+0

'' data.frame (date = index (master_1), valeur = coredata (master_1) [,]) '' pour renommer la variable en une fois. – PatrickT

1

Shane est juste. vous pourriez être à la recherche d'index (vos xts). Voici un exemple reproductible.

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

Ensuite, vous devriez être capable de simplement l'exporter en CSV. Bien sûr, vous pouvez également renommer les lignes.

+0

eh, merci Joshua donc ce n'est pas un nom :) –

+0

Merci ran2 pour l'exemple. Je peux aussi utiliser des noms de scène (x) si x n'est pas un objet XTS. – phrozenpenguin

-2

Une forme élégante pour changer XTS à data.frame:

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

Pas besoin de 'as.matrix', et cela ne répond pas à la question:" écrire un fichier csv 'write.csv (master_1, file =" master_1.csv ")' n'inclut pas l'heure ni la date. et comment puis-je inclure les données de données/heure en tant que colonne, de sorte qu'il est utilisé dans d'autres commandes R et exporté correctement? " – GSee

8

C'est un peu d'une barre latérale, mais la fonction fortify(...) dans le paquet ggplot2 vous permet de convertir une variété d'objets à des trames de données appropriées pour une utilisation dans ggplot(...), y compris xts objets.

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 

Donc, si vous utilisez déjà ce gggplot est un moyen facile de le faire. Notez que l'index va dans une colonne nommée Index (majuscule "I").

+0

Grâce à votre réponse, j'ai réussi à tracer xts dans ggplot2 http://stackoverflow.com/questions/35215579/how-to-plot-xts-in-ggplot2 – aelwan

5

Depuis 1.9.6 Vous pouvez convertir directement de/vers xts sans perdre la classe d'index. Aussi simple que:

as.data.table(master_1) 

L'indice est ajouté en tant que la première colonne dans le résultat data.table, il conserve l'indice Date ou POSIXct classes.

Questions connexes