Как я могу изменить XTS на data.frame и сохранить Index? - PullRequest
29 голосов
/ 02 августа 2010

У меня есть XTS временных рядов в R следующего формата, и я пытаюсь выполнить некоторую обработку, поднабор и реорганизацию перед экспортом в виде CSV для работы в другой программе.*

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"

И я хотел бы преобразовать это в data.frame, чтобы мне было проще манипулировать им и затем экспортировать в другую программу.Однако, когда я использую test1 <- as.data.frame(master_1), у test1 действительно есть Индекс (то есть даты и время), видимый

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 

Но Индекс не отображаетсяCSV write.csv(master_1, file="master_1.csv") не включает время или дату.Почему, и как я могу включить данные / время в виде столбца, чтобы они использовались в других командах R и правильно экспортировались?

Спасибо за любую помощь.

Ответы [ 6 ]

50 голосов
/ 02 августа 2010

Это потому, что даты являются именами строк в вашем data.frame.Вам нужно сделать их отдельной колонкой.

Попробуйте это:

 data.frame(date=index(master_1), coredata(master_1))
13 голосов
/ 24 сентября 2014

Это немного боковая панель, но функция fortify(...) в пакете ggplot2 преобразует различные объекты во фреймы данных, подходящие для использования в ggplot(...), включая 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

Так что, если вы уже используете gggplot, это простой способ сделать это. Обратите внимание, что индекс входит в столбец с именем Index (заглавная "I").

5 голосов
/ 18 января 2015

С 1.9.6 Вы можете конвертировать напрямую из / в xts без потери класса индекса. Так же просто, как:

as.data.table(master_1)

Индекс добавляется как первый столбец в результате data.table, он сохраняет индекс Date или POSIXct классов.

2 голосов
/ 02 августа 2010

Шейн прав.Возможно, вы ищете индекс (ваш XTS).Вот воспроизводимый пример.

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

Тогда вы сможете просто экспортировать его в CSV.Конечно, вы можете переименовать строки тоже.

0 голосов
/ 06 октября 2018

Вы можете преобразовать объект xts в data.frame, который включает в себя индекс в виде столбца с именем «Index» с помощью zoo::fortify.zoo().

Вам не нужен ggplot2, но это все равно будет работать, если вызагружены xts (или zoo) и ggplot2.

Например:

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 голосов
/ 24 сентября 2014

Элегантная форма для изменения XTS на data.frame:

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