2011-12-17 98 views
4

我有一個名爲x矩陣,看起來像這樣:R:窗口()函數

 pTime Close 
1 1275087600 1.2268 
2 1275264000 1.2264 
3 1275264300 1.2265 
4 1275264600 1.2268 
5 1275264900 1.2265 
6 1275265200 1.2265 
7 1275265500 1.2270 
8 1275265800 1.2269 
9 1275266100 1.2268 
10 1275266400 1.2275 
...1000 rows 

我把它與tser<- ts(x)1

轉換爲時間序列數據類型(mts[2000])現在我想使用window()函數(來自stats包)根據它們的POSIX時間戳(pTime字段)隔離#5和#8之間的所有行,但出現錯誤消息。

> A<- as.POSIXct(tser[5,1],origin="1970-01-01 00:00:00 UTC") 
> B<- as.POSIXct(tser[8,1],origin="1970-01-01 00:00:00 UTC") 
> A 
        pTime 
"2010-05-31 01:15:00 EDT" 
> B 
        pTime 
"2010-05-31 01:30:00 EDT" 

> window(tser[,1],A,B) 
Error in window.default(x, ...) : 'start' cannot be after 'end' 
In addition: Warning message: 
In window.default(x, ...) : 'end' value not changed 

任何提示?

回答

5

當您創建時間序列對象時,ts函數期望第一個參數是數據並且沒有時間。 (你可能仍要使用動物園的對象,他們更有意義。)請參閱本會發生什麼:

> window(tser[,1],start=5,end=8) 
Time Series: 
Start = 5 
End = 8 
Frequency = 1 
[1] 1275264900 1275265200 1275265500 1275265800 

日期(以數字表示)已成爲數據!

要使用動物園,它非常簡單。我不確定你的出發點是什麼。我有一個數據框中的數據。如果你實際上有一個矩陣(我懷疑它,因爲它看起來不像矩陣對象的輸出),你可以使用「[row,col]」訪問方式。

require(zoo) 
zooser <- zoo(x=tser$Close, order.by=as.POSIXct(tser$pTime, origin="1970-01-01")) 
window(zooser, start=A, end=B) 
#2010-05-31 01:15:00 2010-05-31 01:20:00 2010-05-31 01:25:00 
#    1.2265    1.2265    1.2270 
#2010-05-31 01:30:00 
#    1.2269 
+0

我明白了 - 謝謝... 隨着動物園對象有辦法做我想要的效率嗎?我需要能夠根據開始和結束數字POSIX時間戳來訪問時間窗口。 – 2011-12-18 01:47:25

+0

是的。 'zoo-objects'有一個'window'方法。我會添加一個例子。 – 2011-12-18 02:11:26

+0

優秀!萬分感謝。 – 2011-12-18 04:14:14