Data.table 使用矩阵自连接条件

Data.table self-join on condition using a matrix

我正在尝试将 data.table 与其自身连接起来。 连接条件基于用于访问矩阵的列(而非键)的值。 每行都有一个日期(以秒为单位),记录应该只与最新记录(t1

cn<-unique(sdd$column)
mat<-matrix(data=0,nrow=lde,ncol=lde,dimnames=list(cn,cn))

我正在努力解决文档常见问题解答(包括 SQL 到 data.table 的类比)和 data.table 的初学者指南以及本论坛中的多个类似问题,但我不能找到解决方法。

Q1, Q2,

我被符号问题困住了。

我的设备标识符是sdd:

> colnames(sdd)
[1] "ID" "DelayStartTimeSeconds" "DelayEndTimeSeconds" "EquipmentID"

我做了几次尝试,例如:

sdd2<-sdd # to avoid problems with the names of variables
sdd[sdd2,eqXrossM[cbind(sdd.EquipmentID,sdd2.EquipmentID)]==1 & sdd.DelayEndTimeSeconds<sdd2.DelayStartTimeSeconds, distance:=sdd.DelayEndTimeSeconds-sdd2.DelayStartTimeSeconds][,distance:=sdd.DelayEndTimeSeconds<sdd2.DelayStartTimeSeconds] # that would be the whole thing to do generating a new column with the time difference

sdd[sdd2[ sdd.DelayEndTimeSeconds<sdd2.DelayStartTimeSeconds, distance:=sdd.DelayEndTimeSeconds<sdd2.DelayStartTimeSeconds]] #this is an approximation attempt.

我根本不明白符号,不同的例子似乎使用不同的符号。

编辑:好吧,经过一夜的睡眠,有些东西是有道理的……但其他东西仍然令人困惑。例如:

sdd_x<-sdd[sdd2,i.DelayStartTimeSeconds>DelayEndTimeSeconds] # returns a vector as long as sdd: len
sdd_x<-sdd[sdd2,i.DelayStartTimeSeconds>DelayEndTimeSeconds & eqXrossM[i.EquipmentID,EquipmentID]==1] # returns a matrix len x len.

为什么添加新条件会改变输出类型?我期待像矩阵这样的情况(需要优化) 此外,由于记录不同,整个矩阵是假的,这不是预期值。事实上,对于第二种情况,上对角线或下对角线都应该为 TRUE。

另外,看起来调用矩阵不需要使用 cbind 作为对提到的类似问题的其他答案。为什么?

我最后的发现是找出 CJ() 运算符,但尝试使用 i。符号在这里不起作用。这部分似乎没有太多记录。

sdd[CJ(DASDelayID,DASDelayID),i.DelayStartTimeSeconds>DelayEndTimeSeconds]

如有任何帮助,我们将不胜感激。

这就是我最终解决问题的方法:

sddx<<-CJ(ID1=sdd$DASDelayID,ID2=sdd$DASDelayID)[
    ID1<ID2] [,
              ':='(Connected=eqXrossM[cbind(sdd[DASDelayID==ID2,EquipmentID],sdd[DASDelayID==ID1,EquipmentID])]==1,
                   Distance=as.integer(sdd[DASDelayID==ID2,DelayStartTimeSeconds]-sdd[DASDelayID==ID1,DelayEndTimeSeconds]))
              ]

一步一步:

生成DelayID的所有组合,数量多但每行只有两列整数

sddx<<-CJ(ID1=sdd$DASDelayID,ID2=sdd$DASDelayID) 

这会将大小减半,因为 ID1 在创建时给出,按 DelayStartTime 和 DelayEndTime>DelayStartTime 排序。

[ID1<ID2] 

这会强制执行访问矩阵的外部条件,请注意 cbind:

[,':='(Connected=eqXrossM[cbind(sdd[DASDelayID==ID2,EquipmentID],sdd[DASDelayID==ID1,EquipmentID])]==1,

计算延迟之间的距离,可用于过滤非严格正值的延迟

Distance=as.integer(sdd[DASDelayID==ID2,DelayStartTimeSeconds]-sdd[DASDelayID==ID1,DelayEndTimeSeconds]))  
              ]

希望对其他人有所帮助。