R data.table to xts with grouping

问题描述 投票:1回答:4

有人知道如何转换这个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,其中列是唯一的(自动收报机),价格低于标准,但我无法弄清楚如何做到这一点。

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

r data.table xts
4个回答
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

1
投票

这是一个只使用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
投票

tidyr::spread从长到宽重塑,然后转换为xts

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

0
投票

你可以试试这个

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
© www.soinside.com 2019 - 2024. All rights reserved.