【发布时间】:2015-12-28 09:50:44
【问题描述】:
假设我们有数据输入:
df.in <- data.frame(event = c(1,2,3,4,5),
start = c("2015-01-01", "2015-01-01", "2015-01-02",
"2015-01-02", "2015-01-03"),
end = c("2015-01-03", "2015-01-04", "2015-01-03",
"2015-01-05", "2015-01-05"))
df.in$start <- as.Date(df.in$start, "%Y-%m-%d")
df.in$end <- as.Date(df.in$end, "%Y-%m-%d")
> df.in
event start end
1 1 2015-01-01 2015-01-03
2 2 2015-01-01 2015-01-04
3 3 2015-01-02 2015-01-03
4 4 2015-01-02 2015-01-05
5 5 2015-01-03 2015-01-05
目标是计算所有事件的发生日期(包括开始,不包括结束)。填写此数据框:
df.out <- data.frame(date = c("2015-01-01", "2015-01-02", "2015-01-03",
"2015-01-04", "2015-01-05"),
count = 0)
df.out$date <- as.Date(df.out$date, "%Y-%m-%d")
> df.out
date count
1 2015-01-01 0
2 2015-01-02 0
3 2015-01-03 0
4 2015-01-04 0
5 2015-01-05 0
从概念上讲,它看起来像这样:
#1 **
#2 ****
#3 ***
#4 **
#5
所以,我目前的想法是循环:
for(i in seq_along(df.out$date)){
temp.df <- df.in[df.in$start <= df.out$date[i],]
df.out$count[i] <- nrow(temp.df) - nrow(temp.df[temp.df$end <= df.out$date[i],])
}
> df.out
date count
1 2015-01-01 2
2 2015-01-02 4
3 2015-01-03 3
4 2015-01-04 2
5 2015-01-05 0
它有效,但我有点担心我正在调用的这个temp.df 可能会滚雪球成非常大的东西。鉴于事件的数量很容易达到数万甚至数十万。
所以我的问题是 - 有没有更有效的方法?也许通过使用一些日期包,例如lubridate,我可以以某种方式对整个事情进行矢量化?
【问题讨论】:
-
啊...所以我再次输入错误的关键字进行搜索。显然我在寻找“重叠”。谢谢!
-
鉴于我熟悉数据表包整整一个小时,就我的知识而言,这些东西似乎有些复杂。不过,我会以你的例子并进行一些实验,看看它会导致什么结果,非常感谢!
-
我已对您的回答进行了编辑(如果您不介意的话)以说明我的评论。