在日期滞后内按组计数记录

  • 本文关键字:记录 日期 滞后 r
  • 更新时间 :
  • 英文 :


我有一个大型数据集,其结构如下

dat <- data.frame("Date" = c("2017-01-01", "2017-01-20", "2017-04-15", "2017-11-03", "2018-01-03", "2019-12-12", "2020-03-07", "2014-05-19", "2009-07-03", "2010-02-04"), 
"Region" = c("Adelaide", "Albany", "Albany", "Albany", "Albany", "Albany", "Albany", "Middleton", "Alice Springs", "Alice Springs"))
dat$Date <- as.Date(dat$Date, "%Y-%m-%d")

对于每条记录,如果它们在前12个月内,并且仅在同一区域内,我想统计记录的数量。如有任何帮助,我们将不胜感激

我的最终数据集应该与原始数据集相同,但添加了以下计数列

dat$Count <- c(0, 0, 1, 2, 3, 0, 1, 0, 0, 1)

该计数列显示,对于数据集中的第一个记录,在前12个月内没有来自同一区域的其他记录,但对于数据集中第五个记录,有3个其他记录在前12月内发生在同一区域内。

我已经在dplyr中使用group_by()count()summarise()尝试了一系列解决方案,但还没有达到我的目的。

对于每个Region,您可以计算当前日期与所有其他日期的差值,并计算0到365天之间的日期数。

library(dplyr)
library(purrr)
dat %>%
group_by(Region) %>%
mutate(Count = map_dbl(row_number(), 
~sum(between(Date[.x] - Date[-.x], 0, 365)))) %>%
ungroup
#    Date       Region        Count
#   <date>     <chr>         <dbl>
# 1 2017-01-01 Adelaide          0
# 2 2017-01-20 Albany            0
# 3 2017-04-15 Albany            1
# 4 2017-11-03 Albany            2
# 5 2018-01-03 Albany            3
# 6 2019-12-12 Albany            0
# 7 2020-03-07 Albany            1
# 8 2014-05-19 Middleton         0
# 9 2009-07-03 Alice Springs     0
#10 2010-02-04 Alice Springs     1

你可以做:

dat %>%
group_by(Region) %>%
mutate(a = accumulate(c(0, diff(Date)), ~if(.x+.y < 365).x+.y else 0))%>%
group_by(Count = cumsum(a==0)) %>%
mutate(Count = seq(n())- 1, a = NULL)

Date       Region        Count
<date>     <chr>         <dbl>
1 2017-01-01 Adelaide          0
2 2017-01-20 Albany            0
3 2017-04-15 Albany            1
4 2017-11-03 Albany            2
5 2018-01-03 Albany            3
6 2019-12-12 Albany            0
7 2020-03-07 Albany            1
8 2014-05-19 Middleton         0
9 2009-07-03 Alice Springs     0
10 2010-02-04 Alice Springs     1

你也可以做:

library(data.table)
setDT(dat)
dat[, Count := c(0, diff(Date)), Region][,
Count := rowid(cumsum(replace(Count, Count>365, 0) == 0))-1]

最新更新