我想为具有时间序列事件的数据表创建时间仓向量。这样的向量中的每个元素指示特定时隙内的度量。数据表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))
在此列中hour
,分别timeSlt
表示每天的小时数和相应的时段。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
如果没有事件发生,则使用sorted timeSlt
并length
用0填充相应的和。
任何帮助,将不胜感激。
我们可以on
基于levels
'timeSlt' 加入一个新创建的data.table ,然后按'timeSlt'分组并获得sum
'length'。
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