我有一个包含 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/