3

给定一个单列 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
4

2 回答 2

4

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

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
于 2012-12-23T15:22:15.070 回答
1

一种解决方案是使用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
于 2012-12-23T10:54:04.633 回答