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]))
]
希望对其他人有所帮助。
我正在尝试将 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]))
]
希望对其他人有所帮助。