【问题标题】:data.table and using roll over multiple columnsdata.table 并使用翻转多列
【发布时间】:2019-03-08 13:25:03
【问题描述】:

我无法理解一些看起来很明显的东西......

 library(data.table)
 DT1<-data.table(MyDate=as.Date(rep("2019-02-01")),MyName=c("John","Peter","Paul"),Rate=c(210,180,190))

 DT2<-data.table(MyDate=seq(as.Date("2019-01-27"),as.Date("2019-02-03"),by="days"))
 setkey(DT1,MyDate)
 setkey(DT2,MyDate)

我希望看到 John、Peter 和 Paul 的费率接近尾声。当我这样做时

DT1[DT2,on=.(MyDate),roll=TRUE]

我明白了:

        MyDate MyName Rate
 1: 2019-01-27   <NA>   NA
 2: 2019-01-28   <NA>   NA
 3: 2019-01-29   <NA>   NA
 4: 2019-01-30   <NA>   NA
 5: 2019-01-31   <NA>   NA
 6: 2019-02-01   John  210
 7: 2019-02-01   Paul  190
 8: 2019-02-01  Peter  180
 9: 2019-02-02  Peter  180
10: 2019-02-03  Peter  180

虽然我想要这个:

       MyDate MyName Rate
 1:  2019-01-27   <NA>   NA
 2:  2019-01-28   <NA>   NA
 3:  2019-01-29   <NA>   NA
 4:  2019-01-30   <NA>   NA
 5:  2019-01-31   <NA>   NA
 6:  2019-02-01   John  210
 7:  2019-02-01   Paul  190
 8:  2019-02-01   Peter 180
 9:  2019-02-02   John  210
 10: 2019-02-02   Paul  190
 11: 2019-02-02   Peter 180
 12: 2019-02-03   John  210
 13: 2019-02-03   Paul  190
 14: 2019-02-03   Peter 180

很明显我忽略了一些东西。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    一种复杂的方式(通过反复试验找到):

    DT1[DT2, on=.(MyDate <= MyDate), allow.cartesian = TRUE]
    
            MyDate MyName Rate
     1: 2019-01-27   <NA>   NA
     2: 2019-01-28   <NA>   NA
     3: 2019-01-29   <NA>   NA
     4: 2019-01-30   <NA>   NA
     5: 2019-01-31   <NA>   NA
     6: 2019-02-01   John  210
     7: 2019-02-01  Peter  180
     8: 2019-02-01   Paul  190
     9: 2019-02-02   John  210
    10: 2019-02-02  Peter  180
    11: 2019-02-02   Paul  190
    12: 2019-02-03   John  210
    13: 2019-02-03  Peter  180
    14: 2019-02-03   Paul  190
    

    【讨论】:

      【解决方案2】:

      困难的部分是您需要在匹配日期之后但不是在该匹配日期之前的交叉连接式行。我认为下面的步骤可以解决这个问题。

      对每个名称执行滚动连接,然后更改 MyName 列并过滤生成的唯一行。

      library(magrittr)
      DT1[, .SD[DT2, roll = TRUE], by = MyName][
            , MyName := ifelse(is.na(Rate), NA, MyName)
          ][order(MyDate, MyName), .(MyDate, MyName, Rate)] %>% 
        unique()
      
              MyDate MyName Rate
       1: 2019-01-27   <NA>   NA
       2: 2019-01-28   <NA>   NA
       3: 2019-01-29   <NA>   NA
       4: 2019-01-30   <NA>   NA
       5: 2019-01-31   <NA>   NA
       6: 2019-02-01   John  210
       7: 2019-02-01   Paul  190
       8: 2019-02-01  Peter  180
       9: 2019-02-02   John  210
      10: 2019-02-02   Paul  190
      11: 2019-02-02  Peter  180
      12: 2019-02-03   John  210
      13: 2019-02-03   Paul  190
      14: 2019-02-03  Peter  180
      

      【讨论】:

      • 太棒了!非常感谢,这确实解决了我的问题。
      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 2014-04-19
      • 1970-01-01
      • 2021-11-27
      • 2020-11-15
      • 2012-01-12
      • 2020-09-04
      • 2020-01-23
      相关资源
      最近更新 更多