data.table 中的滚动联接未提供所需的输出

标签 r data.table

我有一个包含 3 列的 data.table (dt)(“times”、“name”、“price” ”)。我的目标是在输入数字和时间值时找到价格。但是,当我输入不在 dt 中的时间时,我想获取它的下一个(或最后一个)价格。 我正在这样做,但它似乎不起作用,因为如果价格不在 dt 中,我会得到 NA。

library(data.table)
dt <- data.table(
times = c("2017-02-13 07:02:45","2017-02-13 07:02:48","2017-02-13 07:02:49"),
name = c("name1", "name1", "name1"),
price = c(10,15,20)
)

setkey(dt, times, name)

nm = "name1"
tt = "2017-02-13 07:02:46"
dt[times == tt & name == nm]

pricelookup <- function(tt, nm, data = dt) {
dt[J(tt, nm), roll = TRUE][, price]
}
pricelookup(tt,nm)

最佳答案

也许非等值连接更好。使用:

dt[CJ(tt, nm), on = .(times <= V1, name = V2)]

给出:

                 times  name price
1: 2017-02-13 07:02:46 name1    10

在你的函数中:

pricelookup <- function(tt, nm, data = dt) {
  dt[CJ(tt, nm), on = .(times <= V1, name = V2)][, price]
}

现在将给出正确的输出:

> pricelookup(tt, nm)
[1] 10

当您只需要连接的第一个结果时,请将 mult = 'first' 添加到连接操作中。要了解其作用,请比较以下两个连接的输出:

> dt[CJ(tt, nm), on = .(times >= V1, name = V2)]
                 times  name price
1: 2017-02-13 07:02:46 name1    15
2: 2017-02-13 07:02:46 name1    20

> dt[CJ(tt, nm), on = .(times >= V1, name = V2), mult = 'first']
                 times  name price
1: 2017-02-13 07:02:46 name1    15

已用数据:

dt <- data.table(
  times = as.POSIXct(c("2017-02-13 07:02:45","2017-02-13 07:02:48","2017-02-13 07:02:49"), format = "%Y-%m-%d %H:%M:%S"),
  name = c("name1", "name1", "name1"),
  price = c(10,15,20)
)

setkey(dt, times, name)

nm = "name1"
tt = as.POSIXct("2017-02-13 07:02:46", format = "%Y-%m-%d %H:%M:%S")

关于data.table 中的滚动联接未提供所需的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47714120/

相关文章:

r - 使用 ggsave 和 Rscript 时如何阻止 R 创建空的 Rplots.pdf 文件

r - data.table 连接使用一个表中的两列和另一表中的一列

R 函数根据另一组值评估 data.table 列中的值

r - 有什么方法可以强制 data.table 的 fread() 不要停在空行上?

r - 按组可视化混合模型中随机效应的方差

c++ - 如何使用 R CMD 安装 R 库

r - 取决于数字长度的零填充正则表达式

r - 基于 data.table 的动态子组的计算

r - `data.table::unique` 错误 : is not an exported object from namespace

r - 如何使用第二个操作按钮覆盖输出