按成对标准匹配

时间:2017-02-10 00:22:20

标签: r data.table

我正在尝试根据条件匹配两组行后解决有关数据重组的问题。

以data.table A

为例
library(data.table)
A <- data.table(startTime = c('2016-01-31 20:00:53', '2016-01-31 14:00:38', '2016-01-31 20:00:40', '2016-01-31 19:00:30', '2016-01-31 21:00:22'),
           endTime = c('2016-02-01 08:00:11', '2016-01-31 18:01:25', '2016-02-01 08:00:14', '2016-02-01 09:01:25', '2016-02-03 07:00:29'))

             startTime             endTime
1: 2016-01-31 20:00:53 2016-02-01 08:00:11
2: 2016-01-31 14:00:38 2016-01-31 18:01:25
3: 2016-01-31 20:00:40 2016-02-01 08:00:14
4: 2016-01-31 19:00:30 2016-02-01 09:01:25
5: 2016-01-31 21:00:22 2016-02-03 07:00:29

如果我想找到A和它自身之间的成对匹配,为了确定哪些行在它们的时间范围内重叠,我可以使用data.table中的foverlaps(重叠连接)。

A[, startTime := ymd_hms(startTime)][, endTime := ymd_hms(endTime)]
setkey(A, startTime, endTime)

foverlaps(A, A, which = T, type = "any")

结果:

   xid yid
 1:   1   1
 2:   2   2
 3:   2   3
 4:   2   4
 5:   2   5
 6:   3   2
 7:   3   3
 8:   3   4
 9:   3   5

这是我想要匹配的标准的一个例子。在其他情况下,我匹配点之间的距离(使用位置数据),时间戳(而不是时间间隔)等。根据标准的匹配确实不是问题......

我遇到的根本问题是如何将这些匹配分配到包含A - &gt;的组中。 A(L至R)和A - > A(R到L),双向成对匹配。

根据规则,如果(空间示例)A在B的100m范围内且B在C的100m范围内,则应将A,B和C组合在一起。同样,上面显示的时间间隔或时间范围示例,如果A与B(时间)重叠,B与C重叠,则结果组应包含A,B和C.

通过data.table进行时间/日期相等比较,.GRP完成了一个简单的群组成员资格:

locs[ , timeGroup := .GRP , by = time]

但是,对于更复杂的比较测试,结果通常在这2列匹配结构中。

根据上面的数据,应该像这样分配组:

     xid groupID
 1:   1   1
 2:   2   2
 3:   3   2
 4:   4   2
 5:   5   2

因此,我正在寻找基于一些匹配条件对行进行分组的解决方案,将data.table中的所有行与自身进行比较。结果应该是带有原始输入loc的data.table / frame,并附加了groupID的新列。

谢谢。

0 个答案:

没有答案