有人知道如何转换这个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,其中列是唯一的(自动收报机),价格低于标准,但我无法弄清楚如何做到这一点。
我将不胜感激任何帮助。谢谢!
使用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
用tidyr::spread
从长到宽重塑,然后转换为xts
:
dtwide <- tidyr::spread(dt, key=ticker, value=price)
xts(dtwide[, 2:3], order.by=dtwide[[1]])
你可以试试这个
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