当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《R:分组表中缺少级别的零填充》经验,为你挑选了1个好方法。

我想为具有时间序列事件的数据表创建时间仓向量。这样的向量中的每个元素指示特定时隙内的度量。数据表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 timeSltlength用0填充相应的和。

任何帮助,将不胜感激。



1> akrun..:

我们可以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

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有