xts: как сохранить контроль над типами данных после as.xts?

#r #xts #lubridate

#r #xts #lubridate

Вопрос:

Рассмотрим следующий фрейм данных

 time <-c('2016-04-13 23:07:45','2016-04-13 23:07:55','2016-04-13 23:08:45','2016-04-13 23:08:45'
         ,'2016-04-13 23:08:45','2016-04-13 23:07:50','2016-04-13 23:07:51')
group <-c('A','A','A','B','B','B','B')
value<- c(5,10,2,2,NA,1,4)
df=data.frame(time,group,value)

> df
                 time group value
1 2016-04-13 23:07:45     A     5
2 2016-04-13 23:07:55     A    10
3 2016-04-13 23:08:45     A     2
4 2016-04-13 23:08:45     B     2
5 2016-04-13 23:08:45     B    NA
6 2016-04-13 23:07:50     B     1
7 2016-04-13 23:07:51     B     4
  

Обратите внимание на отсутствующую строку значений 5 . Теперь я конвертирую в xts after using lubridate для преобразования моих временных меток в правильные типы Posix.

 > df$time = ymd_hms(df$time)
> df<-as.xts(df,order.by=df$time)
> df
                    time                  group value
2016-04-13 23:07:45 "2016-04-13 23:07:45" "A"   " 5" 
2016-04-13 23:07:50 "2016-04-13 23:07:50" "B"   " 1" 
2016-04-13 23:07:51 "2016-04-13 23:07:51" "B"   " 4" 
2016-04-13 23:07:55 "2016-04-13 23:07:55" "A"   "10" 
2016-04-13 23:08:45 "2016-04-13 23:08:45" "A"   " 2" 
2016-04-13 23:08:45 "2016-04-13 23:08:45" "B"   " 2" 
2016-04-13 23:08:45 "2016-04-13 23:08:45" "B"   NA   
  

и мой хороший numeric столбец value теперь a character !

Как я могу этого избежать?

Спасибо!

Ответ №1:

Базовым объектом xts для данных является матрица, которая может быть числового или символьного типа, но не обоих (в отличие от data.frame, который представляет собой список, где каждый столбец может иметь любой атомарный тип в R). Грубая проверка того, что это произойдет, — попробовать это:

 > as.matrix(df)
     time                  group value
[1,] "2016-04-13 23:07:45" "A"   " 5" 
[2,] "2016-04-13 23:07:55" "A"   "10" 
[3,] "2016-04-13 23:08:45" "A"   " 2" 
[4,] "2016-04-13 23:08:45" "B"   " 2" 
[5,] "2016-04-13 23:08:45" "B"   NA   
[6,] "2016-04-13 23:07:50" "B"   " 1" 
[7,] "2016-04-13 23:07:51" "B"   " 4"
  

что coredata возвращается при создании xts объекта:

 x.df<- xts(df,order.by=df$time)
> coredata(x.df)
     time                  group value
[1,] "2016-04-13 23:07:45" "A"   " 5" 
[2,] "2016-04-13 23:07:50" "B"   " 1" 
[3,] "2016-04-13 23:07:51" "B"   " 4" 
[4,] "2016-04-13 23:07:55" "A"   "10" 
[5,] "2016-04-13 23:08:45" "A"   " 2" 
[6,] "2016-04-13 23:08:45" "B"   " 2" 
[7,] "2016-04-13 23:08:45" "B"   NA   
  

Удалите time group столбцы и при создании объекта xts, чтобы получить числовые данные, как вы ожидаете. Вы могли бы сопоставить типы столбцов группы с целыми числами. Вы также не должны включать time в создание объекта xts для x аргумента, поскольку ваш order.by уже содержит информацию о времени.

например

 df$group_idx <- as.numeric(as.factor(df$group))
x.df<- xts(df[, c("group_idx", "value")],order.by=df$time)
> x.df
                    group_idx value
2016-04-13 23:07:45         1     5
2016-04-13 23:07:50         2     1
2016-04-13 23:07:51         2     4
2016-04-13 23:07:55         1    10
2016-04-13 23:08:45         1     2
2016-04-13 23:08:45         2     2
2016-04-13 23:08:45         2    NA
  

Комментарии:

1. спасибо за ваш подробный ответ! это интересно. Я совсем новичок xts (из the great pandas ), но это ограничение xts кажется мне большим обломком. Это означает, что мы не можем передавать такую информацию, как ISIN коды sector names и другие строки. В принципе, что может xts это сделать, скажем, dplyr или data.table lubridate не может?

2. Вы можете сохранить некоторую качественную информацию в качестве атрибутов в xts объекте. xts упрощает набор данных временных рядов, объединение данных временных рядов на разных временных частотах — это легкий бриз с merge и na.locf, функции TTR естественным образом работают с ним, и это быстро… Вам следует заглянуть на страницу Джеффа Райана в quantmod (google it), чтобы увидеть истинную мощь xts.

3. также я бы обычно не работал со смешиванием цен / значений безопасности в одном объекте xts. Используйте другой объект xts для разных ценных бумаг (это может устранить необходимость в групповом столбце)