data.table中的不等式子集 - 二进制搜索

时间:2018-05-03 15:50:00

标签: r data.table binary-search

我在data.table中获取子集以快速运行时遇到问题。假设我们有一个带有“keyCol”列的数据集,我们想要keyCol == 2的子集。据我所知,通常,最有效的子集是:

setkey(dt, keyCol)
dt[.(2)]

这是data.table非常适合的键控二进制搜索方法。但是,我如何实现这一不平等?是否有一种键入表格的方法,使得ineqaulity搜索可以像平等搜索一样有效?如果我们想要,例如,子集,其中keyCol> 4:

dt[keyCol > 4]

....但这对我的目的来说还不够快。有没有办法做到这一点?或者我是否从根本上误解了密钥二进制搜索的本质?任何输入都会很棒。

由于

编辑:我正在努力解决的确切问题如下。我有一个包含Date,id和group列的数据集。我试图在一些Date视图中找到有多少id更改组。所以我的特定id的数据如下:

Date          id          Group
2018-01-01    A           1
2018-02-01    A           2
2018-03-01    A           1
2018-04-01    A           3
2018-05-01    A           5
2018-06-01    A           1

我想在一些变量“滞后”之前找到他们所在的旧组,所以我创建了一个名为oldGroup的新列:

dt[, oldGroup := Group - c(rep(NA, lag), diff(Group, lag = lag)), id]

因此,如果滞后为1(即我们想要从1个时期前知道该组,我们会得到:

Date          id          Group          oldGroup
2018-01-01    A           1              NA
2018-02-01    A           2              1
2018-03-01    A           1              2
2018-04-01    A           3              1
2018-05-01    A           5              3
2018-06-01    A           1              5

这个问题是有一些id的数据点少于lag参数。换句话说,可能只有5个数据点,但我们希望lag = 6.这将在分配oldGroup期间抛出错误。为了解决这个问题,我事先使用了不等式:

dt[, occurences := .N, id]
dt <- dt[occurences > lag]

这样就不会抛出任何错误,但子集需要花费一秒钟,虽然时间不长,但我想加快速度。

我希望这可以解释这个问题。对不起文字墙。

0 个答案:

没有答案