我在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]
这样就不会抛出任何错误,但子集需要花费一秒钟,虽然时间不长,但我想加快速度。
我希望这可以解释这个问题。对不起文字墙。