R:分组表中缺失级别的零填充

标签 r data.table

我想为具有时间序列事件的数据表创建一个时间段向量。此类向量中的每个元素表示特定时隙内的度量。数据表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 填充。

任何帮助,将不胜感激。

最佳答案

我们可以加入on基于 levels 的新创建的 data.table 'timeSlt',然后按 'timeSlt' 分组并得到 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

关于R:分组表中缺失级别的零填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34305386/

相关文章:

两个不重叠的 `data.table` s 的滚动连接

r - 在滑动窗口中汇总满足条件的交易

r - 将带有 dimnames 的矩阵转换为长格式 data.frame

r - data.table - 拆分多列

r - 使 rbind 循环更快

r - 使用对预先存在的向量的引用创建 data.table

html - 选择 Shiny 的输入样式(用于两个不同的选择框)

R 使用 lapply 保存绘图

r - dplyr:结束年份和开始年份之间的值差异

R - 读取没有分隔符的二进制矩阵