r - 使用 data.table 查找间隔之间的差距

标签 r data.table

我有以下问题:给定一组 不重叠 数据表中的间隔,报告间隔之间的差距。

我已经在 SQL 中实现了一次,但是由于缺少前导函数或滞后函数,我在 data.table 上苦苦挣扎。为了完整起见,我有 here SQL 代码。我知道该功能已在 data.table 版本 1.9.5 中实现。正如 changelog .那么这是否可以使用 data.table 进行,而无需进行大量合并并且没有滞后或领先功能?

原则上,只要性能不受影响,我并不完全反对使用合并(也称为连接)。我认为这有一个简单的实现,但我无法弄清楚如何“获得”上一个结束时间作为我的间隙表的开始时间。

例如:

# The numbers represent seconds from 1970-01-01 01:00:01
dat <- structure(
  list(ID = c(1L, 1L, 1L, 2L, 2L, 2L), 
       stime = structure(c(as.POSIXct("2014-01-15 08:00:00"),
                           as.POSIXct("2014-01-15 11:00:00"),
                           as.POSIXct("2014-01-16 11:30:00"),
                           as.POSIXct("2014-01-15 09:30:00"),
                           as.POSIXct("2014-01-15 12:30:00"),
                           as.POSIXct("2014-01-15 13:30:00")
                           ),
                         class = c("POSIXct", "POSIXt"), tzone = ""),
       etime = structure(c(as.POSIXct("2014-01-15 10:30:00"),
                           as.POSIXct("2014-01-15 12:00:00"),
                           as.POSIXct("2014-01-16 13:00:00"),
                           as.POSIXct("2014-01-15 11:00:00"),
                           as.POSIXct("2014-01-15 12:45:00"),
                           as.POSIXct("2014-01-15 14:30:00")
                           ), 
                         class = c("POSIXct", "POSIXt"), tzone = "")
  ),
  .Names = c("ID", "stime", "etime"),
  sorted = c("ID", "stime", "etime"),
  class = c("data.table", "data.frame"),
  row.names = c(NA,-6L)
)

dat <- data.table(dat)

这导致:
ID               stime               etime
1  2014-01-15 10:30:00 2014-01-15 11:00:00
1  2014-01-15 12:00:00 2014-01-16 11:30:00
2  2014-01-15 11:00:00 2014-01-15 12:30:00
2  2014-01-15 12:45:00 2014-01-15 13:30:00

注意:差距在几天内均匀报告。

最佳答案

大卫答案的变体,可能效率稍低,但输入起来更简单:

setkey(dat, stime)[, .(stime=etime[-.N], etime=stime[-1]), by=ID]

产生:
   ID               stime               etime
1:  1 2014-01-15 10:30:00 2014-01-15 11:00:00
2:  1 2014-01-15 12:00:00 2014-01-16 11:30:00
3:  2 2014-01-15 11:00:00 2014-01-15 12:30:00
4:  2 2014-01-15 12:45:00 2014-01-15 13:30:00

setkey 只是为了确保表按时间排序。

关于r - 使用 data.table 查找间隔之间的差距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30654830/

相关文章:

R 代码用于测试一个回归中回归变量系数之间的差异

xml - 用 R 抓取维基百科来制作列表和数据框

r - 不规则时间序列与 R 的插值

r - 为什么 DT1[DT2][, value1-value] 在列较少的 data.table 上比 DT1[DT2, value1-value] 快?

R data.table 将多列分组为 1 列并求和

r - 如何检查 data.table 各行中的值是否相同

RStudio不保存图片

r - R中的多数票

r - 使用非空列的名称创建一个新列

r - 如何在 R 中使用 Group By 和 order 函数