为重叠时间段绘制数据

3

我有一个政策数据框,就像下面这个:

df<-data.frame(start=as.Date(c("2012-1-1","2012-3-1","2012-3-15")),end=as.Date(c("2012-12-31","2012-8-31","2012-12-31")),
           premium=c(500,200,300))
df
       start        end premium
1 2012-01-01 2012-12-31     500
2 2012-03-01 2012-08-31     200
3 2012-03-15 2012-12-31     300

我想用ggplot在2012-01-01和2012-03-15之间按天绘制总赚取保费的图表。
为了了解赚取的保费,以2012年第一天为例。只有一项保单有效,该保单的总保费为500元,跨越365天,因此1/1/12当天赚取的保费为500/365。同样地,3/1/12当天赚取的保费将是500/365+200/183,因为保单1和保单2都有效。
那么,我如何将2012年所有日期的每日赚得保费绘制成图表呢?

你是在寻找每日累计总和吗? - Gary Weissman
1个回答

0
    df$numdays <- as.numeric(df$end - df$start)
    df$daily_premium <- df$premium / df$numdays

    days_2012 <- seq.Date(from=as.Date('2012-01-01'), to=as.Date('2012-12-31'),by=1)

    check_range <- function(day_i) apply(df, 1, function(x) ifelse(day_i >= x['start'] && day_i <= x['end'], x['daily_premium'], 0))

    day_tally <- sapply(days_2012, check_range)

    day_sums <- colSums(apply(day_tally,2,as.numeric))

    qplot(days_2012,day_sums)

这个可以运行,但是对于大型数据集来说速度较慢。正在等待看看是否有人能够提供更快的实现。 - Ben
哪一个部分比较慢?你的数据集有多大? - Gary Weissman
sapply(days_2012, check_range)并且我的数据集大约有1000行。 - Ben
我的机器上,1000行样本需要74秒,如果我切换到mclapply则只需要36秒。你需要多快? - Gary Weissman
那会很快。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接