【发布时间】:2019-01-05 04:39:16
【问题描述】:
我正在尝试总结重叠时间段的值。 我只能使用 tidyr、ggplot2 和 dplyr 库。不过,Base R 是首选。
我的数据看起来像这样,但通常它有大约 100 条记录:
df <- structure(list(Start = structure(c(1546531200, 1546531200, 546531200, 1546638252.6316, 1546549800, 1546534800, 1546545600, 1546531200, 1546633120, 1547065942.1053), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Stop = structure(c(1546770243.1579, 1546607400, 1547110800, 1546670652.6316, 1547122863.1579, 1546638252.6316, 1546878293.5579, 1546416000, 1546849694.4, 1547186400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Value = c(12610, 520, 1500, 90, 331380, 27300, 6072, 4200, 61488, 64372)), .Names = c("Start", "Stop", "Value"), row.names = c(41L, 55L, 25L, 29L, 38L, 28L, 1L, 20L, 14L, 31L), class = c("tbl_df", "tbl", "data.frame"))
head(df) 和 str(df) 给出:
Start Stop Value
2019-01-03 16:00:00 2019-01-06 10:24:03 12610
2019-01-03 16:00:00 2019-01-04 13:10:00 520
2019-01-03 16:00:00 2019-01-10 09:00:00 1500
2019-01-04 21:44:12 2019-01-05 06:44:12 90
2019-01-03 21:10:00 2019-01-10 12:21:03 331380
2019-01-03 17:00:00 2019-01-04 21:44:12 27300
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 10 obs. of 3 variables:
$ Start: POSIXct, format: "2019-01-03 16:00:00" "2019-01-03 16:00:00" ...
$ Stop : POSIXct, format: "2019-01-06 10:24:03" "2019-01-04 13:10:00" ...
$ Value: num 12610 520 1500 90 331380 ...
因此,具有指定值的“开始”和“结束”日期存在重叠的时间段。在任何给定的记录中,当 df$Start 和 df$Stop 之间有一个值并且超出此范围时,该值为 0。
我想创建另一个数据框,据此我可以展示这些值如何随着时间的推移而总结和变化。期望的输出看起来像这样(“sum”列是组成的):
> head(df2)
timestamp sum
"2019-01-02 09:00:00 CET" 14352
"2019-01-03 17:00:00 CET" 6253
"2019-01-03 18:00:00 CET" 23465
"2019-01-03 21:00:00 CET" 3241
"2019-01-03 22:10:00 CET" 23235
"2019-01-04 14:10:00 CET" 123321
要获得唯一的时间戳:
timestamps <- sort(unique(c(df$`Start`, df$`Stop`)))
使用df2 数据框,我可以很容易地用ggplot 绘制图表,但是如何获得这些总和?
我认为我应该迭代 df 数据框,或者一些自定义函数或任何内置的汇总函数,它们可以像这样工作:
fnct <- function(date, min, max, value) {
if (date >= min && date <=max) {
a <- value
}
else {
a <- 0
}
return(a)
}
...对于来自timestamps 的每个给定的date 遍历df 并给我一个timestamp 的值的总和。
它看起来很简单,但我缺少一些非常基本的东西。
【问题讨论】:
-
你的样本数据有错误:
2019-01-03 16:00:00 2019-01-02 08:00:00 4200,Stop在Start之前 -
我在写我的帖子时没有注意到它,但不幸的是在这种情况下我正在处理它原本就在那里。有些数据是人为的,所以会发生这样的错误。
标签: r