R 滚动时间窗累计和

R 滚动时间窗累计和,r,R,我有关于咒语的数据,包括开始日期和结束日期,由一个人识别 temp <- structure(list(id = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor"), spell = c(1L, 2L, 3L, 1L, 2L, 3L), date1 = structure(c(14611, 14654, 15141, 14853, 14867, 14975), class = "Dat

我有关于咒语的数据,包括开始日期和结束日期,由一个人识别

temp <- structure(list(id = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("1", 
"2"), class = "factor"), spell = c(1L, 2L, 3L, 1L, 2L, 3L), date1 = structure(c(14611, 
14654, 15141, 14853, 14867, 14975), class = "Date"), date2 = structure(c(14612, 
14656, 15142, 14862, 14872, 14976), class = "Date")), class = "data.frame", .Names = c("id", 
"spell", "date1", "date2"), row.names = c(NA, -6L))
然而,除了计算诸如拼写长度和一年前的日期等琐碎的事情外,我不知道如何做到这一点。我发现的最接近的类似问题是,但我不知道如何将其应用于我的问题


有人能帮忙吗?

这里有一种方法可以使用dplyr实现这一点:

require(dplyr)

temp %>%
  mutate(year1 = format(date1, "%Y"),
         year2 = format(date2, "%Y")) %>%
  group_by(id) %>%
  mutate(count = ifelse(lag(year1, 1, default = 0) == year1, lag(date2, 1) - lag(date1,1), 0 )) %>%
  select(-c(year1, year2))

#Source: local data frame [5 x 4]
#Groups: id
#
#  id      date1      date2 count
#1  1 2010-01-02 2010-01-03     0
#2  1 2010-02-14 2010-02-16     1
#3  1 2011-06-16 2011-06-17     0
#4  2 2010-09-01 2010-09-10     0
#5  2 2010-09-15 2010-09-20     9
评论后编辑1 要使用365天“滚动”窗口执行此操作,您可以使用以下方法:

temp %>%
  group_by(id) %>%
  mutate(count = ifelse(date1 - lag(date1, 1, default = 0) <= 365, lag(date2, 1) - lag(date1,1), 0))

我不太清楚的问题是,您是否只想汇总前一行中的日期差异(如果存在,并且早于365天,则“编辑1”应起作用),还是要汇总早于365天的所有之前差异(在这种情况下,“编辑2”应起作用)

这可能是通过软件包实现的。OP要求过去365天的滚动总和,不包括当前观测值。计算365天内日期2到日期1的总和。要排除当前行,可以减去
-拼写天数
,或使用
滞后=1
(排除当前日期)

库(dplyr)
图书馆(跑步者)
温度%>%
分组依据(id)%>%
变异(
拼写天数=日期2-日期1,
观察到的天数过去的天数=总运行天数(
x=拼写天数,
k=365,
idx=date1
)-咒语日
)
#id拼写日期1日期2拼写天数天。观察到的。过去的。年
#                                      
#1 2010-01-02 2010-01-03 1天0天
#2010年02月14日2010年02月16日2天1天
#2011-06-16 2011-06-17 1天0天
#2010年09月01日2010年09月10日9天0天
#2010-09-15 2010-09-20 5天9天
#623 2011-01-01 2011-01-02 1天14天

谢谢,这是一个日历年窗口。是否可以使用365天窗口?也许我应该再次编辑我的问题。当然这是可能的。但它究竟是如何定义的呢?使用
date1
date2
temp %>%
  group_by(id) %>%
  mutate(count = ifelse(date1 - lag(date1, 1, default = 0) <= 365, lag(date2, 1) - lag(date1,1), 0))
df %>%
  group_by(id) %>%
  arrange(id, date1) %>%
  mutate(delta = floor(c(0, diff(date1)) / 365),
         delta = cumsum(delta)) %>%
  group_by(delta, add = TRUE) %>%
  mutate(count = cumsum(as.numeric(date2-date1)) - (date2 - date1)) %>%
  ungroup() %>%
  select(-delta)