首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在data.table中滚动连接不能提供所需的输出

在data.table中滚动连接不能提供所需的输出
EN

Stack Overflow用户
提问于 2017-12-08 12:08:08
回答 1查看 82关注 0票数 2

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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-08 12:48:19

也许非马术的加入更好。使用:

代码语言:javascript
复制
dt[CJ(tt, nm), on = .(times <= V1, name = V2)]

给予:

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

在你的职能中:

代码语言:javascript
复制
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

使用的数据:

代码语言:javascript
复制
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")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47714120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档