web-dev-qa-db-fra.com

Comment puis-je changer XTS en data.frame et conserver Index?

J'ai une série temporelle XTS en format R du format suivant et j'essaie d'effectuer certains traitements, sous-paramétrages et réorganisations avant d'exporter en tant que CSV pour un travail dans un autre programme.

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 j'aimerais convertir ceci en un fichier data.frame afin de pouvoir le manipuler plus facilement, puis l'exporter vers un autre programme. Cependant, lorsque j'utilise test1 <- as.data.frame(master_1), le test1 a l'index (c'est-à-dire les dates et heures) visible,

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'index n'est pas affiché,

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

Et écrire une csv write.csv(master_1, file="master_1.csv") n'inclut pas l'heure ni la date. Pourquoi est-ce cela et comment puis-je inclure les données data/time sous forme de colonne, afin qu’elles soient utilisées dans d’autres commandes R et exportées correctement?

Merci pour toute aide.

27
phrozenpenguin

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

Essaye ça:

 data.frame(date=index(master_1), coredata(master_1))
48
Shane

Ceci est un peu une barre latérale, mais la fonction fortify(...) dans le package ggplot2 convertira une variété d’objets en trames de données utilisables dans ggplot(...), y compris les objets 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

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

13
jlhoward

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

as.data.table(master_1)

L'index est ajouté en tant que première colonne du résultat data.table. Il conserve les classes d'index Date ou POSIXct.

5
jangorecki

Shane a raison. 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 pouvoir simplement l'exporter vers un fichier csv. Bien sûr, vous pouvez également renommer les lignes. 

1
Matt Bannert

Vous pouvez convertir un objet xts en un fichier data.frame contenant l'index sous la forme d'une colonne nommée "Index" avec Zoo::fortify.Zoo().

Vous n'avez pas besoin de ggplot2, mais cela fonctionnera quand même si vous avez chargé xts (ou Zoo) et ggplot2.

Par exemple:

library(xts)
data(sample_matrix)
x <- as.xts(sample_matrix, dateFormat = "Date")
my_df <- fortify.Zoo(x)
head(my_df)
#        Index     Open     High      Low    Close
# 1 2007-01-02 50.03978 50.11778 49.95041 50.11778
# 2 2007-01-03 50.23050 50.42188 50.23050 50.39767
# 3 2007-01-04 50.42096 50.42096 50.26414 50.33236
# 4 2007-01-05 50.37347 50.37347 50.22103 50.33459
# 5 2007-01-06 50.24433 50.24433 50.11121 50.18112
# 6 2007-01-07 50.13211 50.21561 49.99185 49.99185
str(my_df)
# 'data.frame': 180 obs. of  5 variables:
#  $ Index: Date, format: "2007-01-02" "2007-01-03" ...
#  $ Open : num  50 50.2 50.4 50.4 50.2 ...
#  $ High : num  50.1 50.4 50.4 50.4 50.2 ...
#  $ Low  : num  50 50.2 50.3 50.2 50.1 ...
#  $ Close: num  50.1 50.4 50.3 50.3 50.2 ...
0
Joshua Ulrich