将列转换为"yearmon" 类并使用mapply 生成ym 覆盖的年/月。然后计算每年/每月发生的次数,并将其与具有 2002 年 1 月至 2017 年 12 月之间所有年份/月份的数据框合并,给出M_na,并将 NA 替换为 0,给出M。
library(zoo)
DF2 <- transform(DF, Start = as.yearmon(Start), Stop = as.yearmon(Stop))
ym <- unlist(mapply(seq, DF2$Start, DF2$Stop, MoreArgs = list(by = 1/12)))
Ag <- aggregate(ym^0, list(ym = as.yearmon(ym)), sum)
M_na <- merge(Ag, data.frame(ym = as.yearmon(seq(2002, 2017+11/12, 1/12))), all.y = TRUE)
M <- transform(M_na, x = replace(x, is.na(x), 0))
plot(x ~ ym, M, type = "h", xlab = "", ylab = "Count", xaxt = "n")
axis(1, 2002:2017)
(续图)
magrittr
这也可以表示为这样的 magrittr 管道:
library(magrittr)
library(zoo)
M <- DF %>%
transform(Start = as.yearmon(Start), Stop = as.yearmon(Stop)) %$%
unlist(mapply(seq, Start, Stop, MoreArgs = list(by = 1/12))) %>%
{ aggregate(.^0, list(ym = as.yearmon(.)), sum) } %>%
merge(data.frame(ym = as.yearmon(seq(2002, 2017+11/12, 1/12))), all.y = TRUE) %>%
transform(x = replace(x, is.na(x), 0))
注意:我们假设以下输入带有 Date 类列:
Lines <- "
Start Stop
04/09/2006 23/01/2014
06/07/2008 11/03/2017
30/09/2010 22/04/2016"
DF <- read.table(text = Lines, header = TRUE)
fmt <- "%d/%m/%Y"
DF <- transform(DF, Start = as.Date(Start, fmt), Stop = as.Date(Stop, fmt))