【问题标题】:Repeated rolling join without looping没有循环的重复滚动连接
【发布时间】:2016-01-18 22:38:33
【问题描述】:

在 2015 年的每一天之前找到最新“价值”的最有效方法是什么,按 (loc.x, loc.y) 对分组?

dt <- data.table( 
  loc.x = as.integer(c(1, 1, 3, 1, 3, 1)),
  loc.y = as.integer(c(1, 2, 1, 2, 1, 2)),
  time = as.IDate(c("2015-03-11", "2015-05-10", "2015-09-27",
                    "2015-12-31", "2014-09-13", "2015-08-19")), 
  value = letters[1:6]
)
setkey(dt, loc.x, loc.y, time)

需要的输出:

   loc.x loc.y 2015-01-01  ...  2015-12-31
1:     1     1         NA                a
2:     1     2         NA                f
3:     3     1          e                c

【问题讨论】:

  • 试试shift,它接受向量输入一次生成多列

标签: r join data.table


【解决方案1】:

您可以使用CJ 创建一个包含2015 年所有日期和loc.xloc.y 中的唯一值的查找表,然后结合dcast 运行滚动联接。

Lookup <- do.call(CJ, c(unique = TRUE,
                        as.list(dt[, .(loc.x, loc.y)]),
                        list(time = seq(as.IDate("2015-01-01"), 
                                        as.IDate("2015-12-31"), 
                                         by = "day"))))


dcast(dt[Lookup, roll = TRUE, nomatch = 0L], loc.x + loc.y ~ time, value.var = "value")

#    loc.x loc.y 2015-01-01 2015-01-02 2015-01-03 
# 1:     1     1         NA         NA         NA
# 2:     1     2         NA         NA         NA 
# 3:     3     1          e          e          e ... (truncated)

#    2015-12-26 2015-12-27 2015-12-28 2015-12-29 2015-12-30 2015-12-31
# 1:          a          a          a          a          a          a
# 2:          f          f          f          f          f          d
# 3:          c          c          c          c          c          c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-17
    • 2019-08-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多