我正试图在选定交易日的股票价格与同一天的相同股票(我们称之为“Nx观察”)的观察之间进行动物园合并。有时在股票交易日没有Nx观察,有时我们在非交易日有Nx观察。我们想要在交易日没有任何Nx观察的情况下放置“NA”但是在非交易日消除Nx观察,因为在同一天没有交易数据,Nx观察是无用的。
以下SO问题与我的关系很接近,但我将该问题描述为替换缺失数据,而我的目标是真正消除非交易日的观察(如有必要,我们可以改变Nx观察的过程)采取,但它是一个更便宜的解决方案,让它独自一人)。
merge data frames to eliminate missing observations
我准备说明的脚本如下(我是R和SO的新手;欢迎所有建议):
# create Stk_data data.frame for use in the Stack Overflow question
Date_Stk <- c("1/2/13", "1/3/13", "1/4/13", "1/7/13", "1/8/13") # dates for stock prices used in the example
ABC_Stk <- c(65.73, 66.85, 66.92, 66.60, 66.07) # stock prices for tkr ABC for Jan 1 2013 through Jan 8 2013
DEF_Stk <- c(42.98, 42.92, 43.47, 43.16, 43.71) # stock prices for tkr DEF for Jan 1 2013 through Jan 8 2013
GHI_Stk <- c(32.18, 31.73, 32.43, 32.13, 32.18) # stock prices for tkr GHI for Jan 1 2013 through Jan 8 2013
Stk_data <- data.frame(Date_Stk, ABC_Stk, DEF_Stk, GHI_Stk) # create the stock price data.frame
# create Nx_data data.frame for use in the Stack Overflow question
Date_Nx <- c("1/2/13", "1/4/13", "1/5/13", "1/6/13", "1/7/13", "1/8/13") # dates for Nx Observations used in the example
ABC_Nx <- c(51.42857, 51.67565, 57.61905, 57.78349, 58.57143, 58.99564) # Nx scores for stock ABC for Jan 1 2013 through Jan 8 2013
DEF_Nx <- c(35.23809, 36.66667, 28.57142, 28.51778, 27.23150, 26.94331) # Nx scores for stock DEF for Jan 1 2013 through Jan 8 2013
GHI_Nx <- c(7.14256, 8.44573, 6.25344, 6.00423, 5.99239, 6.10034) # Nx scores for stock GHI for Jan 1 2013 through Jan 8 2013
Nx_data <- data.frame(Date_Nx, ABC_Nx, DEF_Nx, GHI_Nx) # create the Nx scores data.frame
# create zoo objects & merge
z.Stk_data <- zoo(Stk_data, as.Date(as.character(Stk_data[, 1]), format = "%m/%d/%Y"))
z.Nx_data <- zoo(Nx_data, as.Date(as.character(Nx_data[, 1]), format = "%m/%d/%Y"))
z.data.outer <- merge(z.Stk_data, z.Nx_data)
2013年1月3日对于Nx观测的NA很好(我们将使用na.locf),但我们需要消除1月5日和6日出现的Nx观测以及股票价格中的相关NA动物园对象的一部分。
我已经阅读了关于使用“all”的merge.zoo的R文档:它的使用“允许 交叉,联合和左右联接表达“。但尝试所有的组合 以下使用“all”产生了相同的结果(为什么是次要问题)。
z.data.outer <- zoo(merge(x = Stk_data, y = Nx_data, all.x = FALSE)) # try using "all"
虽然我很感激对次要问题的评论,但我主要是想学习如何在没有股票交易的日子里消除无关的Nx观察。谢谢。 (并且总体上感谢社区对R的所有重要解释!)
答案 0 :(得分:2)
all
的{{1}}参数必须是(引自帮助文件):
merge.zoo
并且您希望保留第一个参数的所有行,但不保留第二个参数的所有行,因此其值应为logical vector having the same length as the number of "zoo" objects to be merged
(otherwise expanded)
。
c(TRUE, FALSE)
merge(z.Stk_data, z.Nx_data, all = c(TRUE, FALSE))
相对于all
的{{1}}语法更改的原因是merge.zoo
可以合并任意数量的参数,而merge.data.frame
只能处理两个参数所以必须扩展语法以处理它。
另请注意,merge.zoo
应该是问题代码中的merge.data.frame
。
答案 1 :(得分:0)
我希望我已正确理解你想要的输出(“2013年1月3日NAs观察结果很好”;“消除1月5日和6日出现的观察结果”)。我并不认为在合并步骤中需要zoo
。
merge(Stk_data, Nx_data, by.x = "Date_Stk", by.y = "Date_Nx", all.x = TRUE)
# Date_Stk ABC_Stk DEF_Stk GHI_Stk ABC_Nx DEF_Nx GHI_Nx
# 1 1/2/13 65.73 42.98 32.18 51.42857 35.23809 7.14256
# 2 1/3/13 66.85 42.92 31.73 NA NA NA
# 3 1/4/13 66.92 43.47 32.43 51.67565 36.66667 8.44573
# 4 1/7/13 66.60 43.16 32.13 58.57143 27.23150 5.99239
# 5 1/8/13 66.07 43.71 32.18 58.99564 26.94331 6.10034