首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用矩阵的条件下的Data.table自连接

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

Stack Overflow用户
提问于 2015-03-17 13:54:52
回答 1查看 575关注 0票数 1

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

代码语言:javascript
复制
cn<-unique(sdd$column)
mat<-matrix(data=0,nrow=lde,ncol=lde,dimnames=list(cn,cn))

在这个论坛上,我一直在纠结于文档FAQ (包括SQL data.table类推)、data.table入门指南以及多个类似的问题,但我找不到解决它的方法。

Q1Q2Q3

我被符号问题困住了。

我的DT是sdd:

代码语言:javascript
复制
> colnames(sdd)
[1] "ID" "DelayStartTimeSeconds" "DelayEndTimeSeconds" "EquipmentID"

我做了几次尝试,例如:

代码语言:javascript
复制
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.

我只是不明白表示法,不同的例子似乎使用了不同的符号。

编辑:嗯,在睡了一夜之后,有些事情是有道理的.但其他人仍然困惑不解,同样如此。例如:

代码语言:javascript
复制
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.表示法在这里行不通。这部分似乎没有太多的记录。

代码语言:javascript
复制
sdd[CJ(DASDelayID,DASDelayID),i.DelayStartTimeSeconds>DelayEndTimeSeconds]

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-19 01:54:56

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

代码语言:javascript
复制
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的所有组合,数字很大,但每行只有两列整数。

代码语言:javascript
复制
sddx<<-CJ(ID1=sdd$DASDelayID,ID2=sdd$DASDelayID) 

这使得ID1的大小减少到一半,因为DelayStartTime和DelayEndTime>DelayStartTime在创建它们时就给出了它们。

代码语言:javascript
复制
[ID1<ID2] 

这将强制外部条件访问矩阵,请注意cbind:

代码语言:javascript
复制
[,':='(Connected=eqXrossM[cbind(sdd[DASDelayID==ID2,EquipmentID],sdd[DASDelayID==ID1,EquipmentID])]==1,

这计算了延迟之间的距离,可以用来过滤那些不是严格正的延迟。

代码语言:javascript
复制
Distance=as.integer(sdd[DASDelayID==ID2,DelayStartTimeSeconds]-sdd[DASDelayID==ID1,DelayEndTimeSeconds]))  
              ]

我希望它能帮到别人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29100911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档