R中的日期滑动窗口

时间:2018-07-17 21:07:00

标签: r rolling-computation

我正在从事一个项目,如果某项在30天的时间内(对于每个日期)有n次出现次数(在不同日期),则我需要创建一个标志字段TYPE)。如果确实在窗口中发生了n次,那么它将用1标记所有相关日期,如果没有发生,则日期将为0

我的数据看起来像这样:

a <- data.frame("TYPE" = c("A", "A", "B", "B",
                           "C", "C", "C", "C",
                           "D", "D", "D", "D"), 
                "DATE" = c("4/20/2018 11:47",
                           "4/25/2018 7:21",
                           "4/15/2018 6:11",
                           "4/19/2018 4:22",
                           "4/15/2018 17:46",
                           "4/16/2018 11:59",
                           "4/20/2018 7:50",
                           "4/26/2018 2:55",
                           "4/27/2018 11:46",
                           "4/27/2018 13:03",
                           "4/20/2018 7:31",
                           "4/22/2018 9:45"))

首先按TYPE然后按DATE排序,然后说n <- 4,这将是我的预期输出:

Expected Output

重要的是要注意,对于一个类型,将有多个日期是相同的日期,并且每个TYPE都需要一个滚动/移动窗口。

我正在寻求有关如何解决此问题的帮助。

我可以在R中使用SlidingWindow函数,然后定义自己的函数吗?

1 个答案:

答案 0 :(得分:0)

基于dplyr::inner_join的方法可能是:

library(dplyr)

a %>% mutate(DATE = as.POSIXct(DATE, format = "%m/%d/%Y %H:%M")) %>%
inner_join(.,., by="TYPE") %>%
  group_by(TYPE, DATE.x) %>%
  summarise(FLAG = as.integer(sum(abs((DATE.x-DATE.y)/(24*60*60))<=30)>=4))
# # A tibble: 12 x 3
# # Groups: TYPE [?]
# TYPE   DATE.x               FLAG
# <fctr> <dttm>              <int>
# 1 A      2018-04-20 11:47:00     0
# 2 A      2018-04-25 07:21:00     0
# 3 B      2018-04-15 06:11:00     0
# 4 B      2018-04-19 04:22:00     0
# 5 C      2018-04-15 17:46:00     1
# 6 C      2018-04-16 11:59:00     1
# 7 C      2018-04-20 07:50:00     1
# 8 C      2018-04-26 02:55:00     1
# 9 D      2018-04-20 07:31:00     1
# 10 D      2018-04-22 09:45:00     1
# 11 D      2018-04-27 11:46:00     1
# 12 D      2018-04-27 13:03:00     1

注意TYPE = D的4条记录也在30天内。因此,对于1,也应该将FLAG设置为TYPE D