从大型向量

时间:2018-02-16 00:49:40

标签: r vector subset posixct

我有一个包含438000个元素的大型POSIXct向量v2,创建如下:

t.start <- as.POSIXct("2016-08-16 15:00:00 CEST")
v1 <- seq(from = t.start, length.out = 2920, by = "3 hours")
v2 <- rep(v1, each = 150)

v2开始,我想提取12个元素 - 它们第一次出现 - 包含每个月的第一天。具体来说,我寻找:

  1. 这些12个元素中v2的数字位置
  2. %d %b格式的这些元素的实际日期,例如&#34; 01 Sep&#34;
  3. 这两件事应该分别提取,即之后存储在两个不同的矢量中。我认为v1v2包含夏令时POSIXct元素,但这不会影响一般操作。关于如何绕过夏令时的任何暗示都是一个不错的小插件!

    关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

我们可以从format(v2, "%d)的每个元素中提取日期编号。然后,为了确定每个月的第一天,我们可以将其等同于"01"。然后我们可以获取该逻辑向量的diff(),记住在前面连接0L以解释缺少的第一个元素。将其包裹在which()中,并且您拥有每个第一天的第一个元素的索引。

w <- which(c(0L, diff(format(v2, "%d") == "01")) == 1L)
w
# [1]  18451  54451  91651 127801 165001 202201 235801 272851
# [9] 308851 346051 382051 419251

现在w包含我们需要的12个元素的位置。让我们来看看v2的那些元素,只是为了确认我们做对了。

v2[w]
#  [1] "2016-09-01 00:00:00 PDT" "2016-10-01 00:00:00 PDT"
#  [3] "2016-11-01 00:00:00 PDT" "2016-12-01 02:00:00 PST"
#  [5] "2017-01-01 02:00:00 PST" "2017-02-01 02:00:00 PST"
#  [7] "2017-03-01 02:00:00 PST" "2017-04-01 00:00:00 PDT"
#  [9] "2017-05-01 00:00:00 PDT" "2017-06-01 00:00:00 PDT"
# [11] "2017-07-01 00:00:00 PDT" "2017-08-01 00:00:00 PDT"

看起来不错。请注意,我们在那里有一些凌晨2点的条目,这很好,因为它是夏令时。现在让我们达到你想要的格式......

format(v2[w], "%d %b")
# [1] "01 Sep" "01 Oct" "01 Nov" "01 Dec" "01 Jan" "01 Feb"
# [7] "01 Mar" "01 Apr" "01 May" "01 Jun" "01 Jul" "01 Aug"