我有一个大型数据集,其结构如下
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]