2011-10-11 43 views
7

我想選擇時間序列中最後的n個項目。我可以使用[運營商,但我失去了數據的時間序列屬性:選擇時間序列中的最後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) 

爲什麼[操作符不會返回時間序列對象?

回答

7

我懷疑這是不是你在找什麼,但你可以使用普通的提取物([)語法與zoo對象:

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

然後,如果你喜歡,轉換回ts對象:

as.ts(last_zoo) 
+6

或者只是使用'tail(data_zoo,5)'。 –

+0

現在有效。我希望能夠直接對ts對象進行索引,但是從動物園轉換到動物園只需要增加2個額外的步驟,並且從易用性的角度來看似乎是值得的。 – Zach

+1

有了@ JoshuaUlrich的偉大建議,它變得更乾淨,並且可以是一個可讀的單行文本。 'lastN <-tail(as.zoo(data),N)' –

7

[沒有返回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)會做你想要什麼。

+0

編寫'tail.ts'方法是否簡單? –

+0

好主意。我已經把函數名改爲'tail.ts'。 –

+0

由於某些原因,'tail(data,100)'仍然會將它轉換爲數字。我將窗口包裝在'as.ts()'中,並且工作正常。 – metakermit

相關問題