我在data.frame
中有两个R
,每个都按日期编制索引。一个比另一个粗糙,我想仅在较粗略的时间尺度上比较数据。
更具体地说,一个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
。
我希望问题很清楚。我一直在寻找其他SO答案几个小时,但没有找到一个涵盖我正在尝试做的事情。提前谢谢。
答案 0 :(得分: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执行此操作的方法:
merge(x, y, join="right")
答案 1 :(得分:1)
这是我的问题的解决方案,从开始到结束。
问题:根据我的经纪人的记录(时间间隔不均匀),将我的净值的时间序列放在S&amp; P的时间序列旁边,以便在{{1 }}
<强>答案强>:
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
1}}数据类型容忍。)
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
('87)和%Y
(1987)以及%y
- 月和{{之间存在很大差异1}} - 分钟。我的经纪人写了10/23/2009。
我做得对吗?
%m
Yessss。
最后,@Joshua Ulrich的建议实现了我想要的那种合并:
%M
> class(MyNetWorth)
[1] "xts" "zoo"
只比较粗略的比较日期(我的数据总是比雅虎更粗)。
最后,绘制结果:
comparison <- merge(GSPC$GSPC.Adjusted, MyNetWorth$NetAssets, join="right")
非常感谢所有编写所有这些开源软件的人 - 尤其是那些写过小插曲的人!