我想为具有时间序列事件的数据表创建时间仓向量。这样的向量中的每个元素指示特定时隙内的度量。数据表dt如下:

dt=structure(list(
           hour = c("20", "21", "21", "21", "21", "02", "02", "02", "02", "02"),
           timeSlt = structure(c(6L, 6L, 6L, 6L, 6L, 1L, 1L, 1L, 1L, 1L), .Label = c("[0,4)", "[4,8)", "[8,12)", "[12,16)", "[16,20)", "[20,24)"), class = "factor"),
           play_length = c(208.67, 188.49, 58.5, 3.469, 17.92, 211.513, 193.045, 225.306, 212.715, 226.873)),
           .Names = c("hour", "timeSlt", "length"),
           class = c("data.table","data.frame"), row.names = c(NA, -10L))


其中hourtimeSlt列分别指示每天的小时数和相应的时隙。 timeSlt是一个因素:

dt[, timeSlt]
# [1] [20,24) [20,24) [20,24) [20,24) [20,24) [0,4)   [0,4)   [0,4)   [0,4)   [0,4)
# Levels: [0,4) [4,8) [8,12) [12,16) [16,20) [20,24)


我想对每个时隙的length求和:

dt[, sum(length), by=timeSlt]
#    timeSlt       V1
# 1: [20,24)  477.049
# 2:   [0,4) 1069.452


但是所需的输出应该是

y = data.table(timeSlt=levels(dt[, timeSlt]), sumLength=c(1069.452, 0, 0, 0, 0, 477.049))
#    timeSlt sumLength
# 1:   [0,4)  1069.452
# 2:   [4,8)     0.000
# 3:  [8,12)     0.000
# 4: [12,16)     0.000
# 5: [16,20)     0.000
# 6: [20,24)   477.049


如果没有事件发生,则将其与排序后的timeSltlength的相应总和填充为0。

任何帮助,将不胜感激。

最佳答案

我们可以基于'timeSlt'的on加入levels一个新创建的data.table,然后按'timeSlt'分组并获得'length'的sum

dt[setDT(list(timeSlt= levels(dt$timeSlt))), on='timeSlt'
       ][, list(sumLength=sum(length, na.rm=TRUE)), by = timeSlt]
#   timeSlt sumLength
#1:   [0,4)  1069.452
#2:   [4,8)     0.000
#3:  [8,12)     0.000
#4: [12,16)     0.000
#5: [16,20)     0.000
#6: [20,24)   477.049




base R选项是

as.data.frame(xtabs(length~timeSlt, dt))
#  timeSlt     Freq
#1   [0,4) 1069.452
#2   [4,8)    0.000
#3  [8,12)    0.000
#4 [12,16)    0.000
#5 [16,20)    0.000
#6 [20,24)  477.049

07-26 01:14