【问题标题】:Selecting last n items in a time series选择时间序列中的最后 n 个项目
【发布时间】:2011-10-11 18:26:20
【问题描述】:

我想选择时间序列的最后n 项。我可以使用[运算符,但是我丢失了数据的时间序列属性:

data <- ts(1:10, frequency = 4, start = c(1959, 2))
data[(length(data)-4):length(data)] 

我编写了一个包装函数来重新应用时间序列属性,但我想知道是否有更优雅的方法来做到这一点?

lastN <- function(data,n) {
    out <- data[(length(data)-n+1):length(data)] 
    ts(out, end=end(data), frequency=frequency(data))
}
data
lastN(data,5)

为什么[ 运算符不返回时间序列对象?

【问题讨论】:

    标签: r time-series subset


    【解决方案1】:

    我怀疑这不是您想要的,但您可以使用通常的提取 ([) 语法和 zoo 对象:

    library(zoo)
    data_zoo <- as.zoo(data)
    last_zoo <- data_zoo[(length(data_zoo)-4):length(data_zoo)]
    

    然后,如果您愿意,可以转换回 ts 对象:

    as.ts(last_zoo)
    

    【讨论】:

    • 或者直接使用tail(data_zoo,5)
    • 目前有效。我更希望能够直接索引ts 对象,但是从动物园转换到/从动物园只增加了 2 个额外的步骤,从易用性的角度来看似乎是值得的。
    • 有了@JoshuaUlrich 的好建议,它变得更加简洁,并且可以成为可读的单行字。 lastN&lt;-tail(as.zoo(data),N)
    【解决方案2】:

    [ 不返回 ts 对象,因为例如 data[c(1,5,6)] 将不起作用。取而代之的是window() 函数:

    window(data,start=tsp(data)[2]-4/frequency(data))
    

    所以你的 lastN 函数的修改将是

    tail.ts <- function(data,n) {
      data <- as.ts(data)
      window(data,start=tsp(data)[2]-(n-1)/frequency(data))
    }
    

    然后tail(data,5) 会做你想做的事。

    【讨论】:

    • 写一个tail.ts方法就这么简单吗?
    • 好主意。我已将函数名称更改为 tail.ts
    • 出于某种原因,tail(data, 100) 仍然为我将其转换为数字。我将窗口包裹在as.ts() 中,它可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2020-12-18
    • 2011-06-18
    • 2011-06-04
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    相关资源
    最近更新 更多