我正在尝试根据条件匹配两组行后解决有关数据重组的问题。
以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的新列。
谢谢。