【问题标题】:Eliminating Existing Observations in a Zoo Merge消除 Zoo 合并中的现有观察
【发布时间】:2014-02-26 12:32:55
【问题描述】:

我正在尝试在选定交易日的股票价格和同一天对这些股票的观察(我们称之为“Nx 观察”)之间进行动物园合并。有时在股票交易日没有 Nx 观察,有时我们在非交易日有 Nx 观察。我们想要放置一个“NA”,我们在交易日没有任何 Nx 观察结果,但在非交易日有 Nx 观察结果时消除 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动物园对象的部分。

我已经阅读了 merge.zoo 的 R 文档关于“all”的使用:它的使用“允许 交集、并集和左右连接要表达”。但尝试所有组合 使用“all”之后产生了相同的结果(至于为什么会是次要问题)。

z.data.outer <- zoo(merge(x = Stk_data, y = Nx_data, all.x = FALSE)) # try using "all"

虽然我希望 cmets 关于第二个问题,但我主要感兴趣的是学习如何在没有股票交易的日子消除无关的 Nx 观察。谢谢。 (感谢社区对 R 的所有精彩解释!)

【问题讨论】:

    标签: r merge zoo


    【解决方案1】:

    merge.zooall 参数必须是(引用帮助文件):

    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))
    

    merge.zoo 相对于 merge.data.frameall 语法发生变化的原因是 merge.zoo 可以合并任意数量的参数,而 merge.data.frame 只处理两个,因此必须扩展语法以处理它.

    另请注意,%Y 在问题代码中应该是%y

    【讨论】:

    • 我无法回答@Henrik 关于需要 zoo 包的好问题;我猜你有,我从中学到了一些东西。我只是在努力将较早的答案应用于实际问题,与简化问题不同,该问题的日期跨越数年;合并的日期不是按顺序排列的,而是当我返回并将您的解决方案应用于我的动物园对象时。此外,%y 而不是 %Y: 注明。谢谢。
    【解决方案2】:

    我希望我已经正确理解了您想要的输出(“Nx 观测的 2013 年 1 月 3 日的 NA 很好”;“消除 [...] 出现在 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 
    

    【讨论】:

    • 非常感谢。为什么动物园日期索引没有出现在您的解决方案中?也只是为了我自己的学习,我替换了“all.y = TRUE”。 NA 出现在预期的位置,但日期不正确。关于为什么的任何想法?再次感谢。
    • 不客气!我不明白您所说的“为什么没有出现动物园日期索引”是什么意思。我使用您的原始数据框,而不是 zoo 对象。关于顺序(或缺少顺序):尽管您尝试使用 sort 参数,但合并有时会弄乱顺序。如果您的“合并变量”在两个数据集中具有相同的名称(例如,您可以将“Date_Stk”和“Date_Nx”都命名为“日期” - 它们都是...eeeh...日期),您可以在包plyr 中尝试join。来自?join:“与merge 不同,无论使用何种连接类型,都保留x 的顺序。”
    • 谢谢@Henrik。虽然其他解决方案似乎工作正常,但我很高兴有你的额外 cmets,因为我在 R 学习曲线上还很远。
    • @WBarker,很高兴为您提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2020-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多