library(tidyverse)
set.seed(1)
start <- mdy("01/01/2022")
end <- start + as.difftime(99, units = "days")
days <- seq(from = start, to = end, by = 1)
days <- sample(days, 100, replace = T)
expiry <- seq(from = start, to = end + 300, by = 1)
expiry <- sample(expiry, 100, replace = T)
x <- sample(1:10, 100, replace = T)
df <- tibble(days = days, expiry = expiry, value = x)
df <- df %>% filter(days != expiry) %>% arrange(days)
df$expiry[2] = mdy("01-02-2022")
df
# A tibble: 100 × 3
days expiry value
<date> <date> <int>
1 2022-01-01 2022-07-23 10
2 2022-01-01 2022-01-02 3
3 2022-01-02 2022-10-27 4
4 2022-01-06 2022-12-22 2
5 2022-01-07 2022-03-19 5
6 2022-01-10 2023-01-08 2
7 2022-01-13 2022-06-23 8
8 2022-01-13 2022-05-02 5
9 2022-01-14 2022-08-02 5
10 2022-01-14 2022-03-06 1
# ℹ 90 more rows
# ℹ Use `print(n = ...)` to see more rows
我要创建的是一个dataframe,它包含一年中每个日期的所有值条目的总和,这些值条目的天数<;=date和过期&>;=date.我试了下下面的方法.
days <- seq(from = mdy("01/01/2022"), to = mdy("12-31-2022"), by = 1)
s <- rep(0, length(day))
i = 0
for (d in day){
for (v in df){
if (v[1] <= d & v[2] >= d){
s[i] = s[i] + v[3]
}
}
i <- i + 1
}
tb <- tibble(day, s)
# A tibble: 365 × 2
day s
<date> <dbl>
1 2022-01-01 0
2 2022-01-02 0
3 2022-01-03 0
4 2022-01-04 0
5 2022-01-05 0
6 2022-01-06 0
7 2022-01-07 0
8 2022-01-08 0
9 2022-01-09 0
10 2022-01-10 0
# ℹ 355 more rows
# ℹ Use `print(n = ...)` to see more rows
这里的结果应该是S的前3个条目是10+3=13,10+3+4=17,10+4=14.自2022-01-03>;2022-01-02表中的条目2到期.
基于前10行的预期输出应如下所示:
# A tibble: 10 × 2
x y
<date> <dbl>
1 2022-01-01 13
2 2022-01-02 17
3 2022-01-03 14
4 2022-01-04 14
5 2022-01-05 14
6 2022-01-06 16
7 2022-01-07 21
8 2022-01-08 21
9 2022-01-09 21
10 2022-01-10 23
从本质上讲,我要做的是模仿EXCEL中的Sumifs函数: