我正在尝试将一个data.table与自身连接起来。联接的条件是基于用于访问矩阵的列(而不是键)的值。每一行都有一个日期(以秒为单位),记录应该只与最新记录(t1 )连接。
cn<-unique(sdd$column)
mat<-matrix(data=0,nrow=lde,ncol=lde,dimnames=list(cn,cn))在这个论坛上,我一直在纠结于文档FAQ (包括SQL data.table类推)、data.table入门指南以及多个类似的问题,但我找不到解决它的方法。
我被符号问题困住了。
我的DT是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.为什么添加一个新的条件会改变输出的类型?我期待的情况,如矩阵(这将需要优化),此外,整个矩阵是假的,不是期望值,因为记录是不同的。事实上,对于第二种情况,上对角线或下对角线应该是真的。
而且,看起来对矩阵的调用不需要使用cbind作为类似问题的其他答案。为什么要这样?
我最近的发现是找出了CJ()运算符,但是尝试使用i.表示法在这里行不通。这部分似乎没有太多的记录。
sdd[CJ(DASDelayID,DASDelayID),i.DelayStartTimeSeconds>DelayEndTimeSeconds]任何帮助都将不胜感激。
发布于 2015-03-19 01:54:56
这就是我最终解决问题的方法:
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]))
]我希望它能帮到别人。
https://stackoverflow.com/questions/29100911
复制相似问题