R数据表间隔

3

DT是具有POSIXct列“date_and_time”的data.table。我如何使用data.table语法添加一个3级因子列,指示每个“date_and_time”实例属于哪个班次?

DT <- data.table(date_and_time = as.POSIXct(
  c("1997-07-01 23:00",
    "1999-01-01 02:05",
    "2006-01-01 12:00",
    "2009-01-01 22:30",
    "2012-07-01 03:59"), required.components = 5L)
  )
shifts_delimiter = c("00:00", "08:00", "16:00")

所需结果:

> DT
         date_and_time shift
1: 1997-07-01 23:00:00     3
2: 1999-01-01 02:05:00     1
3: 2006-01-01 12:00:00     2
4: 2009-01-01 22:30:00     3
5: 2012-07-01 03:59:00     1

也许可以使您的示例更具可重现性,并提供所需的输出。 - David Arenburg
2个回答

3
您可以使用data.table包提供的ITime类和findInterval函数来实现。
shifts_delimiter = c("00:00", "08:00", "16:00")
DT[, Shift := findInterval(as.ITime(date_and_time), as.ITime(shifts_delimiter))]
DT
#          date_and_time Shift
# 1: 1997-07-01 23:00:00     3
# 2: 1999-01-01 02:05:00     1
# 3: 2006-01-01 12:00:00     2
# 4: 2009-01-01 22:30:00     3
# 5: 2012-07-01 03:59:00     1

另一种选项是将整数作为有序间隔,并使用内置的hour函数和findInterval函数。

shifts_delimiter = c(8L, 16L, 24L)
DT[, Shift2 := findInterval(hour(date_and_time), shifts_delimiter) + 1L]
DT
#          date_and_time Shift Shift2
# 1: 1997-07-01 23:00:00     3      3
# 2: 1999-01-01 02:05:00     1      1
# 3: 2006-01-01 12:00:00     2      2
# 4: 2009-01-01 22:30:00     3      3
# 5: 2012-07-01 03:59:00     1      1

2
如果您的数据集很小,那么这个方法可能就像任何其他方法一样有效。
DT[, shift := 1] # Default assignment
DT[hour(date_and_time) >= 8, shift := 2] # adjust for shift 2 and above
DT[hour(date_and_time) >= 16, shift := 3] # adjust for shift 3

另外,您可以创建一个shifts表以及小时列,通过滚动连接将表格合并在一起。

DT[, hour := hour(date_and_time)]
setkey(DT, hour)
shift_table <- data.table(hour = hour(as.ITime(shifts_delimiter)), shift = 1:3, key = "hour")
shift_table[DT, roll = TRUE]

谢谢Zachary。 我喜欢David Arenburg的解决方案,因为它很优雅。 然而,你提供的替代方案给了我一个好主意,可以在项目后期使用。在data.table中滚动连接真的是一个非常有用的工具。 - Amitai
这是一个很好的滚动连接的应用,您可以简化为 DT [,hour:= as.ITime(date_and_time)] ; data.table(hour = as.ITime(shifts_delimiter))[DT,on ="hour",roll = TRUE,which = TRUE] - David Arenburg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接