Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R数据表间隔_R_Data.table_Posixct - Fatal编程技术网

R数据表间隔

R数据表间隔,r,data.table,posixct,R,Data.table,Posixct,DT是带有POSIXct列“日期和时间”的data.table。 如何使用data.table语法添加一个3级因子列,指示每个“日期”和“时间”实例所属的班次 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"), r

DT是带有POSIXct列“日期和时间”的data.table。 如何使用data.table语法添加一个3级因子列,指示每个“日期”和“时间”实例所属的班次

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

您可以将
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
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

另一个选项是使用整数作为有序间隔,并将内置的
hour
函数与
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
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

如果您的数据集很小,那么这可能和任何东西一样好

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
或者,您也可以通过创建一个轮班表和一个小时列来进行滚动联接,以便通过将这些表合并在一起

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]
DT[,小时:=小时(日期和时间)]
设置键(DT,小时)

shift_表可能会使您的示例更具可复制性,也会使您的期望输出更具可复制性。谢谢Zachary。我喜欢David Arenburg解决方案,因为它很优雅。但是,您的替代解决方案为项目的后续工作提供了一个好主意。data.table中的滚动联接是非常有用的工具这是滚动联接的一个很好的用法,您可以将其缩短为
DT[,hour:=as.ITime(date_和_time)];data.table(hour=as.ITime(移位分隔符))[DT,on=“hour”,roll=TRUE,which=TRUE]