1) Base R 使用末尾注释中可重复显示的数据 lapply over erach 行,使用 seq 将日期范围扩展为日期序列。这给出了一个列表,每个输入行一个组件,我们将它们绑定在一起,给出long。然后通过Date 聚合long。没有使用任何包。
expand <- function(i, data) with(data[i, ],
data.frame(Date = seq(START, END, "day"), NUMBER)
)
long <- do.call("rbind", lapply(1:nrow(DF), expand, data = DF))
result <- aggregate(NUMBER ~ Date, long, sum)
head(result)
给予:
Date NUMBER
1 2020-03-16 12
2 2020-03-17 13
3 2020-03-18 13
4 2020-03-19 13
5 2020-03-20 13
6 2020-03-21 13
2) dplyr 展开rowwise 代码中的每一行,然后在group_by 代码中将NUMBER 与Date 相加。
library(dplyr)
DF %>%
rowwise %>%
do(data.frame(Date = seq(.$START, .$END, "day"), NUMBER = .$NUMBER)) %>%
ungroup %>%
group_by(Date) %>%
summarize(NUMBER = sum(NUMBER)) %>%
ungroup
注意
Lines <- " START END NUMBER
1 2020-03-16 2020-05-31 5
2 2020-03-16 2020-06-30 7
3 2020-03-17 2020-08-31 1"
DF <- read.table(text = Lines)
DF[1:2] <- lapply(DF[1:2], as.Date)