Rdata.table区间
R data.table interval
DT 是 data.table,POSIXct 列 'date_and_time'。
如何使用 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
您可以将 data.table
软件包提供的 ITime
class 与 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
如果您的数据集很小,那么它的效果可能和其他任何东西一样好。
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
或者,您可以通过创建班次 table 和小时列来进行滚动连接,以将 table 合并在一起。
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 是 data.table,POSIXct 列 'date_and_time'。 如何使用 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
您可以将 data.table
软件包提供的 ITime
class 与 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
如果您的数据集很小,那么它的效果可能和其他任何东西一样好。
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
或者,您可以通过创建班次 table 和小时列来进行滚动连接,以将 table 合并在一起。
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]