2011-06-28 118 views
0

我在R中有兩個data.frame s,每個都按日期進行索引。一個比另一個粗糙,我想比較僅在較粗糙的時間尺度上的數據。只比較精細時間序列和粗略時間序列

更具體地說,我們假設一個data.frame有時間點DF1[a,b,c,...,x,y,z],另一個只有DF2[f,p,t],其中p=="July 19, 1917"。我想比較DF1[f,p,t]DF2[f,p,t]

這不是句法,但我想做for each $i { DF_combined <- df1[$i] . df2[$i] if exists(df1[$i]); }。換句話說,做一個新的data.frame,只包含每個共享的觀察日。

我希望問題很清楚。我一直在尋找其他的答案几個小時,並沒有找到一個涵蓋我想要做的事情。提前致謝。

回答

1

這是我的問題,從開始到結束的解決方案。

問題:從我的經紀人鑑於記錄(在時間上並不是均勻間隔),把時間序列我旁邊的一個時間序列在S & P的淨資產作比較的R

#get S&P data 
require(quantmod) 
getSymbols("^GSPC", from="2004-01-01", src="yahoo") 
head(GSPC) 

       GSPC.Open GSPC.High GSPC.Low GSPC.Close GSPC.Volume GSPC.Adjusted 
2004-01-02 1111.92 1118.85 1105.08 1108.48 1153200000  1108.48 
2004-01-05 1108.48 1122.22 1108.48 1122.22 1578200000  1122.22 
2004-01-06 1122.22 1124.46 1118.44 1123.67 1494500000  1123.67 

發現,有超過日期沒有頭。這是因爲時間序列數據類型將時間值嵌入到排序索引中。 (class(GSPC) = [1] "xts" "zoo"其中zoo是由索引全序數據類型,並xts是時間序列數據類型容忍多於限制性本地ts數據類型容忍。)

#coerce the .csv from my broker into a time-series data type as well 
MyNetWorth <- read.csv("/home/joey/Desktop/Historical_NAV.csv") 
require(xts) 
MyNetWorth <- as.xts(MyNetWorth, 
            order.by= as.Date(MyNetWorth$TradeDate, format="%m/%d/%Y")) 

在日期format有是%Y('87)和%y(1987)之間以及在個月和10分鐘之間的很大差異。我的經紀人寫了10/23/2009。

所以我做對了嗎?

> class(MyNetWorth) 
[1] "xts" "zoo" 

Yessss。

最後,@Joshua Ulrich的建議做那種合併的我想:

comparison <- merge(GSPC$GSPC.Adjusted, MyNetWorth$NetAssets, join="right") 

right join日期,只在較粗的尺度比較(我的數據總是比雅虎更粗)。

最後,要繪製的結果:

plot(as.zoo(comparison) , screens=c(1,1), col=c("red", "#333333") ) 

非常感謝大家誰寫的這一切開源軟件—,特別是對那些誰寫短文的人!

3

合併你的data.frames,然後做任何你想要的操作。

# assume the frequency of x > frequency of y (i.e. y is "coarse") 
merge(x, y, by="row.names", all.y=TRUE) # dates are in row.names 
merge(x, y, by="date", all.y=TRUE)  # dates are in "date" column 

既然你有時間序列,我建議你使用時間序列類而不是data.frame。我建議xts/zoo。這裏是你如何做到這一點與xts:

​​
+0

哇,我有很多東西要學。我認爲完全有序的對象⊃不規則的時間序列⊃時間序列,+標題,畢竟是一個非常具體的數據類型。即使在2000年年底,開源社區也做了大量的工作,甚至沒有包括錢伯斯等人。感謝您的正確加入提示,那將是另一個狐狸追捕。 – isomorphismes