【问题标题】:R data.table to xts with groupingR data.table 到 xts 与分组
【发布时间】:2019-02-16 03:00:02
【问题描述】:

有人知道如何转换这个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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        用tidyr::spread从长到宽重新整形,然后转换为xts:

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

        【讨论】:

          【解决方案4】:

          你可以试试这个

          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
          

          【讨论】:

            猜你喜欢
            • 2012-03-06
            • 2016-04-20
            • 1970-01-01
            • 1970-01-01
            • 2013-06-25
            • 2020-03-29
            • 1970-01-01
            • 1970-01-01
            • 2022-11-15
            相关资源
            最近更新 更多