我正在从事一个项目,如果某项在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
,这将是我的预期输出:
重要的是要注意,对于一个类型,将有多个日期是相同的日期,并且每个TYPE
都需要一个滚动/移动窗口。
我正在寻求有关如何解决此问题的帮助。
我可以在R中使用SlidingWindow函数,然后定义自己的函数吗?
答案 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
。