2017-01-16 33 views
1

我有一系列的日期的数据帧,这里是它的一个简化版本:子集时间序列(日期顺序)到一个列表

> eventdates 
    dr.rank dr.start  dr.end 
1  14 1964-09-30 1964-10-06 
2  16 1964-11-01 1964-12-24 

我也有关联值等时间序列的日期的是,这里的时间序列的大大简化版本:

ts1964 <- data.frame(DATE = seq(from = as.Date("1964-01-01"), to = as.Date("1964-12-31"), by = "days"), 
        Q = 1:366) 

我所试图做的是在eventdates每个日期子集合,例如:

> filter(ts1964, ts1964$DATE >= eventdates[1,2] & ts1964$DATE <= eventdates[1,3]) 
     DATE Q 
1 1964-09-30 274 
2 1964-10-01 275 
3 1964-10-02 276 
4 1964-10-03 277 
5 1964-10-04 278 
6 1964-10-05 279 
7 1964-10-06 280 
8 1964-10-07 281 
9 1964-10-08 282 
10 1964-10-09 283 
11 1964-10-10 284 
12 1964-10-11 285 
13 1964-10-12 286 
14 1964-10-13 287 
15 1964-10-14 288 
16 1964-10-15 289 
17 1964-10-16 290 
18 1964-10-17 291 
19 1964-10-18 292 
20 1964-10-19 293 
21 1964-10-20 294 
22 1964-10-21 295 
23 1964-10-22 296 
24 1964-10-23 297 
25 1964-10-24 298 
26 1964-10-25 299 
27 1964-10-26 300 
28 1964-10-27 301 
29 1964-10-28 302 
30 1964-10-29 303 
31 1964-10-30 304 
32 1964-10-31 305 
33 1964-11-01 306 
> 

但我需要做这个数百次。我想要做的是让每个子集在列表中形成一个元素。我通常会考虑在plyr中使用类似dlply的东西,但是当我使用dplyr时,这不是一个选项。任何人都可以建议我如何实现这一目标吗?感谢

+0

不应你的例子是'滤波器(ts1964,ts1964 $ DATE> = eventdates [1,1]&ts1964 $ DATE <= eventdates [1,2]) '? – Abdou

+0

好抓@Abdou,它应该读[1,2]然后[1,3]。我会修改:) – Visser

回答

4

我们可以使用Map

Map(function(x,y) filter(ts1964, DATE >= x & DATE <= y), 
        eventdates$dr.start, eventdates$dr.end) 
+0

谢谢,太棒了!试图了解这是如何工作的。它实质上是使用'apply'的形式吗? (well,'mapply' ...) – Visser

+1

它有点等同于'lapply(split(eventdates,seq(nrow(eventdates))),function(x){dplyr :: filter(ts1964,DATE> = x $ dr .start&DATE <= x $ dr.end) })'。 – Abdou