r - 条件(不等式)加入 data.table

标签 r data.table

我只是想弄清楚如何对两个 data.tables 进行条件连接。

dt2

dt2

我写了一个 sqldf有条件的加入给我开始或结束时间在另一个开始/结束时间之内的电路。

sqldf("select dt2.start, dt2.finish, dt2.counts, dt1.id, dt1.circuit 
      from dt2 
        left join dt1 on (
          (dt2.start  >= dt1.start and dt2.start  < dt1.finish) or 
          (dt2.finish >= dt1.start and dt2.finish < dt1.finish)
        )")

result

这给了我正确的结果,但是对于我的大型数据集来说太慢了。

什么是data.table在没有矢量扫描的情况下如何做到这一点?

这是我的数据:
dt1 <- data.table(structure(list(circuit = structure(c(2L, 1L, 2L, 1L, 2L, 3L, 
1L, 1L, 2L), .Label = c("a", "b", "c"), class = "factor"), start = structure(c(1393621200, 
1393627920, 1393628400, 1393631520, 1393650300, 1393646400, 1393656000, 
1393668000, 1393666200), class = c("POSIXct", "POSIXt"), tzone = ""), 
    end = structure(c(1393626600, 1393631519, 1393639200, 1393632000, 
    1393660500, 1393673400, 1393667999, 1393671600, 1393677000
    ), class = c("POSIXct", "POSIXt"), tzone = ""), id = structure(1:9, .Label = c("1001", 
    "1002", "1003", "1004", "1005", "1006", "1007", "1008", "1009"
    ), class = "factor")), .Names = c("circuit", "start", "end", 
"id"), class = "data.frame", row.names = c(NA, -9L)))


dt2 <- data.table(structure(list(start = structure(c(1393621200, 1393624800, 1393626600, 
1393627919, 1393628399, 1393632000, 1393639200, 1393646399, 1393650299, 
1393655999, 1393660500, 1393666199, 1393671600, 1393673400), class = c("POSIXct", 
"POSIXt"), tzone = ""), end = structure(c(1393624799, 1393626600, 
1393627919, 1393628399, 1393632000, 1393639200, 1393646399, 1393650299, 
1393655999, 1393660500, 1393666199, 1393671600, 1393673400, 1393677000
), class = c("POSIXct", "POSIXt"), tzone = ""), seconds = c(3599L, 
1800L, 1319L, 480L, 3601L, 7200L, 7199L, 3900L, 5700L, 4501L, 
5699L, 5401L, 1800L, 3600L), counts = c(1L, 1L, 0L, 1L, 2L, 1L, 
0L, 1L, 2L, 3L, 2L, 3L, 2L, 1L)), .Names = c("start", "end", 
"seconds", "counts"), row.names = c(1L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 11L, 12L, 13L, 14L, 15L), class = "data.frame"))

最佳答案

使用非 equi 连接:

ans = dt1[dt2, on=.(start <= end, end > start), 
           .(i.start, i.end, counts, id, circuit, cndn = i.start < x.start & i.end >= x.end), 
           allow.cartesian=TRUE
        ][!cndn %in% TRUE]

条件start <= end, end >= start (注意两种情况下的>=)将检查两个间隔是否以任何方式重叠。一侧的开区间由 end > start 完成部分( > 而不是 >= )。但它仍然会选择类型的间隔:
         dt1: start=================end
   dt2: start--------------------------------end ## start < start, end > end


         dt1: start=================end
                dt2: start----------end          ## end == end
cndn列是检查和删除这些情况。希望这些情况不会很多,这样我们就不会不必要地实现不需要的行。

PS:这种情况下的解决方案并不像我想的那么简单,那是因为该解决方案需要 OR手术。可以进行两个条件连接,然后将它们绑定(bind)在一起。

也许在某些时候,我们必须考虑以更直接的方式将连接扩展到这些类型的操作的可行性。

关于r - 条件(不等式)加入 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22680641/

相关文章:

r - 如何在多个多方面ggplot2图形中实现相同的方面大小和比例?

r - R中数据框中连续的字符串,列表对

r - 将满足所有可能条件的条件的所有值相加

r - 将函数与 group-by 一起应用于 data.table 的所有列

r - 在 data.table 的列中“分组”实数

r - 无法使用 sf() 和 rnaturalearth() 在 R 中提取湖泊几何数据

r - 计算一列中的百分比变化,从第一年到去年

r - 执行半反连接(在二进制搜索中)

r - 将字符串作为代码传递以使用 data.table 汇总多列

r - 在 data.table tstrsplit 中动态分配分割数