消除动物园合并中的现有观察

时间:2014-02-26 12:32:55

标签: r merge zoo

我正试图在选定交易日的股票价格与同一天的相同股票(我们称之为“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的所有重要解释!)

2 个答案:

答案 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