2011-06-28 47 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