R data.table в xts с группировкой - PullRequest
       8

R data.table в xts с группировкой

0 голосов
/ 11 сентября 2018

Кто-нибудь знает, как преобразовать эти данные. Таблица

library(data.table)
library(xts)
library(lubridate)
dt <- data.table(date=c(today()+months(0:4),today()+months(0:4)),price=c(100,102,104,106,108,100,99,101,98,102),ticker=c(rep("A",5),rep("B",5)))

в xts, как это

xts(cbind(A=c(100,102,104,106,108),B=c(100,99,101,98,102)),c(today()+months(0:4)))

Я пытался использовать dcast или создать новую таблицу данных, в которой столбцы уникальны (тикер) и цены указаны ниже, но я не могу понять, как это сделать.

Буду признателен за любую помощь. Спасибо!

Ответы [ 4 ]

0 голосов
/ 14 сентября 2018

Вот решение, которое использует только xts и zoo:

d <- as.Date("2018-09-11")
Data <- data.frame(
  date = rep(seq(d, by = "1 month", length.out = 5), 2),
  price = c(100, 102, 104, 106, 108, 100, 99, 101, 98, 102),
  ticker = c(rep("A", 5), rep("B", 5)))

x <- as.xts(read.zoo(Data, split = "ticker"))
print(x)
#              A   B
# 2018-09-13 100 100
# 2018-10-13 102  99
# 2018-11-13 104 101
# 2018-12-13 106  98
# 2019-01-13 108 102
0 голосов
/ 11 сентября 2018

Изменить с длинного на широкий с tidyr::spread, а затем преобразовать в xts:

dtwide <- tidyr::spread(dt, key=ticker, value=price)
xts(dtwide[, 2:3], order.by=dtwide[[1]])
0 голосов
/ 11 сентября 2018

Использование dcast из data.table:

dt <- data.table(date=c(today()+months(0:4),today()+months(0:4)),price=c(100,102,104,106,108,100,99,101,98,102),ticker=c(rep("A",5),rep("B",5)))

dt <- dcast(dt, date ~ ticker,  value.var = "price")
my_xts <- xts(dt[, -1], order.by = dt$date)

             A   B
2018-09-11 100 100
2018-10-11 102  99
2018-11-11 104 101
2018-12-11 106  98
2019-01-11 108 102
0 голосов
/ 11 сентября 2018

Вы можете попробовать это

library(reshape)    
dt1 <- cast(dt, date~ticker, value = "price") #reshaping to required format
xts(dt1, order.by = dt1$date) #converting to xts object

#returns
             A   B
2018-09-11 100 100
2018-10-11 102  99
2018-11-11 104 101
2018-12-11 106  98
2019-01-11 108 102
...