2011-10-11 15 views
7

Chcę wybrać ostatnie pozycje n z szeregu czasowego. Mogę użyć operatora [, ale tracę atrybuty szeregów czasowych danych:Wybieranie ostatnich n pozycji w szeregu czasowym

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

pisałem funkcji otoki do ponownego zastosowania czas atrybutów serii, ale zastanawiałem się, czy nie było więcej elegancki sposób to zrobić?

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

Dlaczego operator [ nie zwraca obiektu szeregów czasowych?

Odpowiedz

7

Podejrzewam, że to nie jest to, czego szukasz, ale można użyć zwykły ekstrakt ([) składni z zoo obiektów:

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

Następnie, jeśli chcesz, przekształcić z powrotem do ts obiekt:

as.ts(last_zoo) 
+6

Lub po prostu użyj 'tail (data_zoo, 5)'. –

+0

To działa na razie. Wolałbym móc indeksować obiekty 'ts' bezpośrednio, ale konwersja do/z zoo po prostu dodaje 2 dodatkowe kroki i wydaje się być warta z punktu widzenia łatwości użycia. – Zach

+1

Dzięki wspaniałej sugestii @ JoshuaUlrich staje się ona znacznie czystsza i może być czytelna jako jedna linijka. 'lastN <-tail (as.zoo (data), N)' –

7

[ nie zwraca ts obiektu, ponieważ data[c(1,5,6)] na przykład nie będzie działać. Zamiast tego jest funkcja window():

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

Więc modyfikacją swojej funkcji lastN byłoby

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

Następnie tail(data,5) będą robić to, co chcesz.

+0

Czy byłoby tak łatwo napisać metodę 'tail.ts'? –

+0

Dobry pomysł. Zmieniłem nazwę funkcji na 'tail.ts'. –

+0

Z jakiegoś powodu 'tail (data, 100)' nadal rzuca go na numeryczny dla mnie. Zawinęłam okno w 'as.ts()' i to działa. – metakermit

Powiązane problemy