给定一个单列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
答案 0 :(得分: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
答案 1 :(得分: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
我更喜欢使用另一个答案中提到的[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