【问题标题】:Subset timeseries (date sequence) into a list日落时间序列(日期序列)成列表
【发布时间】:2017-01-16 16:07:37
【问题描述】:

我有一个包含一系列日期的数据框,这是它的简化版本:

> 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 时,这不是一个选项。任何人都可以建议我如何实现这一目标吗?谢谢

【问题讨论】:

  • 你的例子不应该是filter(ts1964, ts1964$DATE &gt;= eventdates[1,1] &amp; ts1964$DATE &lt;= eventdates[1,2])吗?
  • 很好 @Abdou,它应该是 [1,2] 然后是 [1,3]。我会修改:)

标签: r list dplyr


【解决方案1】:

我们可以使用Map

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

【讨论】:

  • 谢谢,太好了!只是想了解这是如何工作的。它本质上是使用apply 的形式吗? (嗯,mapply...)
  • 有点等价于lapply(split(eventdates, seq(nrow(eventdates))), function(x) { dplyr::filter(ts1964, DATE &gt;= x$dr.start &amp; DATE &lt;= x$dr.end) })
猜你喜欢
  • 2010-09-19
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 2018-09-06
相关资源
最近更新 更多