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

时间:2015-03-17 13:54:53

标签: r join data.table self-join

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

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

我正在努力处理文档常见问题解答(包括SQL到data.table类比)和数据表初学者指南以及此论坛中的多个类似问题,但我找不到如何解决它。

Q1Q2Q3

我遇到了符号问题。

我的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.

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

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

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

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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

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]))  
              ]

我希望它可以帮助别人。