我正在寻找一种按时间填写时间序列数据集的方法。我使用的非常低效的方法是为每个组设置split
数据集,并在该列表的所有元素中应用自定义时间序列填充函数(在最大值和最小值之间创建序列,并合并)。不用说,这个行动不会通过分裂。为每个组填充时间序列的有效方法
我的数据集的样子,
source grp cnt 1: 83 2017-06-06 13:00:00 1 2: 83 2017-06-06 23:00:00 1 3: 83 2017-06-07 03:00:00 1 4: 83 2017-06-07 07:00:00 2 5: 83 2017-06-07 13:00:00 1 6: 83 2017-06-07 19:00:00 1 7: 83 2017-06-08 00:00:00 1 8: 83 2017-06-08 14:00:00 1 9: 83 2017-06-08 15:00:00 1 10: 83 2017-06-08 20:00:00 1 11: 137 2017-06-04 02:00:00 1 12: 137 2017-06-04 05:00:00 1 13: 137 2017-06-04 23:00:00 1 ...
我的尝试是利用complete
功能使用tidyverse
方法,即
library(tidyverse)
d1 %>%
group_by(source) %>%
complete(source, grp = seq(min(grp), max(grp), by = 'hour'))
然而,约40-45秒后,出现了一个进度条(显然在某些完美功能中是一个整洁的功能 - 在这种情况下我怀疑是complete
) 9小时完成。我的数据集非常大,这不是最轻的操作,所以我要找的东西真的很有效。
DATA
#dput(d1)
structure(list(source = c("83", "83", "83", "83", "83", "83",
"83", "83", "83", "83", "137", "137", "137", "137", "137", "137",
"137", "137", "137", "137", "137", "137", "137", "137"), grp = structure(c(1496743200,
1496779200, 1496793600, 1496808000, 1496829600, 1496851200, 1496869200,
1496919600, 1496923200, 1496941200, 1496530800, 1496541600, 1496606400,
1496617200, 1496649600, 1496696400, 1496808000, 1496844000, 1496876400,
1496962800, 1497880800, 1497888000, 1497978000, 1497996000), class = c("POSIXct",
"POSIXt"), tzone = ""), cnt = c(1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
)), .Names = c("source", "grp", "cnt"), row.names = c(NA, -24L
), class = "data.frame")
相关:[为数据框中缺失值添加行的最快方法](https://stackoverflow.com/questions/10438969/fastest-way-to-add-rows-for-missing -values-in-a-data-frame/10473931#10473931) – Henrik
@亨利克感谢您的链接。我实际上经历了很多关于填补缺失日期的问题,但其中任何一个都不需要分组。 – Sotos
另请参见:[按组填写缺失日期](https://stackoverflow.com/a/31502628/1851712) – Henrik