df <- data.frame("Date"=seq(as.Date("2020/1/1"),by="day", length.out = 20),events=sample(0:100,20))
尝试对最接近的求和
df <- df %>% mutate(seven_sum=sum(events[Date <= Date & Date > Date-7]) )
然后我想总结过去 7 天内发生的所有事情,我可以理解为什么这不起作用,但不是真正如何解决它。 所以基本上我想在 7 天内的每一行和所有其他行的总和。如果我使用固定的日期范围,修复起来很麻烦,但我想为每一行进行更改......
关于如何继续的任何建议都将非常有帮助。
使用purrr::map_int
:
library(dplyr)
library(purrr)
df %>% mutate(seven_sum=map_int(Date, ~sum(events[Date <= .x & Date > (.x-7)])))
# Date events seven_sum
#1 2020-01-01 66 66
#2 2020-01-02 94 160
#3 2020-01-03 49 209
#4 2020-01-04 39 248
#5 2020-01-05 84 332
#6 2020-01-06 29 361
#7 2020-01-07 36 397
#8 2020-01-08 20 351
#9 2020-01-09 40 297
#10 2020-01-10 25 273
#11 2020-01-11 3 237
#12 2020-01-12 97 250
#13 2020-01-13 22 243
#14 2020-01-14 63 270
#15 2020-01-15 58 308
#16 2020-01-16 91 359
#17 2020-01-17 26 360
#18 2020-01-18 47 404
#19 2020-01-19 35 342
#20 2020-01-20 38 358
和基数 R 中的相同逻辑:
sapply(df$Date, function(x) sum(df$events[df$Date <= x & df$Date > (x-7)]))
我们可以使用data.table
方法来执行非 equi 连接,这将更有效
library(data.table)
v1 <- setDT(df)[df[, Date1 := Date - 7], sum(events),
on = .(Date <= Date, Date > Date1), allow.cartesian =TRUE, by = .EACHI]$V1
df[, seven_sum := v1][]