R data.table 到带分组的 xts

R data.table to xts with grouping

有谁知道如何转换这个data.table

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 或创建一个新的 data.table,其中的列是唯一的(代码)并且价格如下,但我不知道该怎么做。

如有任何帮助,我将不胜感激。谢谢!

你可以试试这个

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

tidyr::spread 从长变宽,然后转换为 xts:

dtwide <- tidyr::spread(dt, key=ticker, value=price)
xts(dtwide[, 2:3], order.by=dtwide[[1]])

使用 data.table 中的 dcast:

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

这里有一个只使用 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