我正在尝试查找第一个日期(每组),该日期是一个星期以及下一个星期的记录。每周从星期一开始,但定义为7天。
假设日期是第一周的第一天,我试图测试第二个“周”中的日期记录数是否大于一个。
library(data.table)
dt=data.table(date=c(1,9,10,15,18,3,4,7,7,19,21,27),
group=c(rep("a", 5), rep("b",7)))
> dt
date group
1: 1 a
2: 9 a
3: 10 a
4: 15 a
5: 18 a
6: 3 b
7: 4 b
8: 7 b
9: 7 b
10: 19 b
11: 21 b
12: 27 b
适用于data.frame的for循环如下所示:
df <- data.frame(dt)
for(i in 1:length(df$date)){
df$count[i] <- sum(df$date >= df$date[i] + 7 &
df$date < df$date[i] + 14 &
df$group == df$group[i])
}
> df
date group count
1 1 a 2
2 9 a 1
3 10 a 1
4 15 a 0
5 18 a 0
6 3 b 0
7 4 b 0
8 7 b 1
9 7 b 1
10 19 b 1
11 21 b 0
12 27 b 0
每组计数大于0的第一个日期会给我第一周的开始日期,即“ a”组为1,“ b”组为7。
我的实际data.table有超过一千万行,因此理想情况下,我想要一个类似于上述for循环的函数,因此我可以执行以下操作:
dt[, date/sum(date), by=group]
问题是我不明白如何使用适用于data.table的索引创建函数。任何帮助,不胜感激。
我认为这可行:
# set the key for the rolling merges
setkey(dt, group, date)
# find start and end point of the intervals you want
start = dt[J(group, date + 7 ), .I, roll = -Inf, by = .EACHI]$I
end = dt[J(group, date + 13), .I, roll = Inf, by = .EACHI]$I
# if start is 0, the first condition is not satisfied, so set count to 0
dt[, count := (start != 0) * (end - start + 1)]
dt
# date group count
# 1: 1 a 2
# 2: 9 a 1
# 3: 10 a 1
# 4: 15 a 0
# 5: 18 a 0
# 6: 3 b 0
# 7: 4 b 0
# 8: 7 b 1
# 9: 7 b 1
#10: 19 b 1
#11: 21 b 0
#12: 27 b 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句