【问题标题】:How do I subset every day except the last five days of zoo data?除了最后五天的动物园数据外,我如何每天对每一天进行子集化?
【发布时间】:2014-05-31 04:35:57
【问题描述】:

我正在尝试从动物园数据集中提取除过去五天之外的所有日期到单个对象中。

这个问题和How do I subset the last week for every month of a zoo object in R?有点关系

您可以使用以下代码重现数据集:

set.seed(123)
price <- rnorm(365)
data <- cbind(seq(as.Date("2013-01-01"), by = "day", length.out = 365), price)
zoodata <- zoo(data[,2], as.Date(data[,1]))

对于我的输出,我希望得到一个包含每个月最后五天以外的所有内容的组合数据集。例如,如果第一个月的数据有 20 天,第二个月的数据有 19 天,我只想分别对前 15 天和 14 天的数据进行子集化。

我尝试使用head() 函数和first() 函数来提取前三周,但由于每个月的天数会根据月份或闰年月份不同,因此并不理想。

谢谢。

【问题讨论】:

    标签: r xts zoo


    【解决方案1】:

    这里有一些方法:

    1) as.Datett 成为日期。然后我们计算一个与tt 相同长度的Date 向量,它具有相应的月末日期。然后,我们挑选出距离该日期至少 5 天的日期:

    tt <- time(zoodata)
    last.date.of.month <- as.Date(as.yearmon(tt), frac = 1)
    zoodata[ last.date.of.month - tt >= 5 ]
    

    2) tapply/head 对于每个月的数据,tapply head(x, -5),然后将减少的月份连接在一起:

    do.call("c", tapply(zoodata, as.yearmon(time(zoodata)), head, -5))
    

    3) ave 定义revseq,它给定一个向量或动物园对象以相反的顺序返回序列号,以便最后一个元素对应于1。然后使用ave创建一个向量@987654329 @ 与 zoodata 的长度相同,它将这样的反向序列号分配给每个月的日期。因此,当月最后一天的 ix 值为 1,倒数第二天为 2,依此类推。最后将 zoodata 子集为与大于 5 的序列号对应的元素:

    revseq <- function(x) rev(seq_along(x))
    ix <- ave(seq_along(zoodata), as.yearmon(time(zoodata)), FUN = revseq)
    z <- zoodata[ ix > 5 ]
    

    添加解决方案 (1) 和 (2)。

    【讨论】:

    • 这个方案更快
    • 美丽。谢谢。
    【解决方案2】:

    与你其他问题的答案完全相同:

    按月拆分数据集,去掉最后5天,加一个“-”:

    library(xts)
    xts.data <- as.xts(zoodata)
    lapply(split(xts.data, "months"), last, "-5 days")
    

    同样的方式,如果你想在一个对象上使用它:

    do.call(rbind, lapply(split(xts.data, "months"), last, "-5 days")) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多