#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 greatpandas
), но это ограничениеxts
кажется мне большим обломком. Это означает, что мы не можем передавать такую информацию, какISIN
кодыsector names
и другие строки. В принципе, что можетxts
это сделать, скажем,dplyr
илиdata.table
lubridate
не может?2. Вы можете сохранить некоторую качественную информацию в качестве атрибутов в
xts
объекте. xts упрощает набор данных временных рядов, объединение данных временных рядов на разных временных частотах — это легкий бриз с merge и na.locf, функции TTR естественным образом работают с ним, и это быстро… Вам следует заглянуть на страницу Джеффа Райана в quantmod (google it), чтобы увидеть истинную мощь xts.3. также я бы обычно не работал со смешиванием цен / значений безопасности в одном объекте xts. Используйте другой объект xts для разных ценных бумаг (это может устранить необходимость в групповом столбце)