【发布时间】:2017-02-02 18:01:23
【问题描述】:
我希望对超过阈值的多个实例站点进行滚动计数。
我的数据的简化版本:
Dates SiteID Value
1 2015-04-01 A 9.1
2 2015-04-02 A 8.8
3 2015-04-02 A 7.9
4 2015-04-03 A 9.2
5 2015-04-08 A 9.3
6 2015-04-11 A 8.9
7 2015-04-11 A 9.2
8 2015-04-13 A 9.1
9 2015-04-16 A 7.8
10 2015-04-01 B 9.1
11 2015-04-01 B 8.8
12 2015-04-04 B 9.9
13 2015-04-05 B 7.8
14 2015-04-06 B 9.8
15 2015-04-06 B 9.2
16 2015-04-07 B 9.1
17 2015-04-08 B 8.5
18 2015-04-15 B 9.1
如果滚动期为 3 天且“价值”的阈值为 9,我正在寻找一个新列“超出”,它计算“价值”在过去 3 天内大于 9 的次数在给定的“SiteID”。所以这看起来像:
Dates SiteID Value Exceedances
1 2015-04-01 A 9.1 1
2 2015-04-02 A 8.8 1
3 2015-04-02 A 7.9 1
4 2015-04-03 A 9.2 2
5 2015-04-08 A 9.3 1
6 2015-04-11 A 8.9 0
7 2015-04-11 A 9.2 1
8 2015-04-13 A 9.1 2
9 2015-04-16 A 7.8 0
10 2015-04-01 B 9.1 1
11 2015-04-01 B 8.8 1
12 2015-04-04 B 9.9 1
13 2015-04-05 B 7.8 1
14 2015-04-06 B 9.8 2
15 2015-04-06 B 9.2 3
16 2015-04-07 B 9.1 3
17 2015-04-08 B 8.5 3
18 2015-04-15 B 9.1 1
DT = structure(list(r = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L), Dates = structure(c(16526, 16527,
16527, 16528, 16533, 16536, 16536, 16538, 16541, 16526, 16526,
16529, 16530, 16531, 16531, 16532, 16533, 16540), class = "Date"),
SiteID = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "B",
"B", "B", "B", "B", "B", "B", "B", "B"), Value = c(9.1, 8.8,
7.9, 9.2, 9.3, 8.9, 9.2, 9.1, 7.8, 9.1, 8.8, 9.9, 7.8, 9.8,
9.2, 9.1, 8.5, 9.1), Exceedances = c(1L, 1L, 1L, 2L, 1L,
0L, 1L, 2L, 0L, 1L, 1L, 1L, 1L, 2L, 3L, 3L, 3L, 1L)), .Names = c("r",
"Dates", "SiteID", "Value", "Exceedances"), row.names = c(NA,
-18L), class = "data.frame")
我见过使用 data.table 和 deplyr 的类似问题,但没有一个解决计数超出阈值的问题。
最终这将应用于非常大的数据集,因此速度最快的方法会受到赞赏。如果这会对建议产生影响,我也会将其应用于滚动年份而不是上面的 3 天示例,并且数据集将包含“NA”。
【问题讨论】:
-
第 5 行和第 18 行冲突:两者的值 > 9 并且在前三天没有 obs,但是一个得到 1 的结果,而另一个得到 0...?顺便说一句,如果您希望得到解决该案例的答案,您实际上应该展示一个带有 NA 的示例。
-
“日期”的顺序重要吗?因为,对于前 3 天的第 6 行和第 7 行,有 1 个值 > 9"。为什么这不计入第 6 行?
-
我在问题中添加的
structure部分是为了使其可重现。请在进行更改时对其进行维护,或找到其他方法来保持它的可重复性。一些指导:stackoverflow.com/a/28481250
标签: r data.table dplyr