我有一个data.table (dt),包含3列("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)发布于 2017-12-08 12:48:19
也许非马术的加入更好。使用:
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]
}它将给出正确的输出:
标价(tt,nm) 1 10
当您只想要连接的第一个结果时,将mult = 'first'添加到联接操作中。若要查看此操作,请比较以下两个联接的输出:
dtCJ(tt,nm),on =.(倍频>= V1,name = V2)倍名价格1: 2017-02-13 07:02:46 name1 15 2: 2017-02-07:02:02:02:02:46 name1 20 > dtCJ(tt,nm),on = .(times >= V1,name = V2),mult = 'first‘倍名价格1: 2017-02 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")https://stackoverflow.com/questions/47714120
复制相似问题