【问题标题】:How to update a row in a multi-column XTS object?如何更新多列 XTS 对象中的一行?
【发布时间】:2012-12-24 05:37:13
【问题描述】:

给定一个单列 xts 对象,我可以像这样更新一行:

library(xts)
a=xts(1:5,Sys.Date()+1:5)
b=xts(77:77,Sys.Date()+2)
a[index(b)]=b

但是一旦我有 2+ 行,它就会失败,并显示“要替换的项目数不是替换长度的倍数”:

a=xts(1:5,Sys.Date()+1:5);colnames(a)='x';a$y=11:15
b=xts(77:77,Sys.Date()+2);colnames(b)='x';b$y=78:78
a[index(b)]=b

我应该如何更新 xts 对象中的单行?

目前我有这个技巧:

a$x[index(b)]=b$x
a$y[index(b)]=b$y

有没有更好的办法?

预期结果:

> a
            x  y
2012-12-24  1 11
2012-12-25 77 78
2012-12-26  3 13
2012-12-27  4 14
2012-12-28  5 15

【问题讨论】:

    标签: r xts


    【解决方案1】:

    最简单的方法是在子集命令中使用逗号:

    a=xts(1:5,Sys.Date()+1:5);colnames(a)='x';a$y=11:15
    b=xts(77:77,Sys.Date()+2);colnames(b)='x';b$y=78:78
    a[index(b),]=b
    

    【讨论】:

    • a[index(b),]
    • @agstudy:目前在 CRAN (0.8-8) 上使用 xts 对我来说效果很好。
    • 谢谢,我已经确认它有效。 (我发现我又被 R 中的逗号和括号弄糊涂了!)
    • @JoshuaUlrich 我有相同的版本。也许是因为我们没有相同的时区。我更新了我的答案,以显示我使用你的方法时所拥有的东西。
    【解决方案2】:

    一种解决方案是使用coredata 来操作矩阵

        coredata(a)[index(a)==index(b)] <- coredata(b)
    
    > a
                x  y
    2012-12-24  1 11
    2012-12-25 77 78
    2012-12-26  3 13
    2012-12-27  4 14
    2012-12-28  5 15
    

    我更喜欢使用另一个答案中提到的 a[index(b),]=b ,但是由于某些原因,当我使用它时,我没有相同的结果。 (它改变了第一个日期而不是第二个日期)

     a=xts(1:5,Sys.Date()+1:5);colnames(a)='x';a$y=11:15
    > b=xts(77:77,Sys.Date()+2);colnames(b)='x';b$y=78:78
    > a[index(b),]=b
    > a
                x  y
    2012-12-23 77 78
    2012-12-24  2 12
    2012-12-25  3 13
    2012-12-26  4 14
    2012-12-27  5 15
    

    与

    > b
                x  y
    2012-12-24 77 78
    

    【讨论】:

    • 我无法重现您的第二个案例。我首先尝试没有设置 TZ,然后尝试使用 Sys.setenv(TZ = "UTC")。你能显示str(a)和str(b)吗?我正在运行 xts 的 0.8-8 版、zoo 的 1.7-9 版和 R 的 2.15.2 版。
    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    相关资源
    最近更新 更多