在XTS对象上使用cbind会将先前列名称中的破折号( - )字符更改为点(。)

时间:2014-09-16 15:56:11

标签: r xts cbind

我有一些R代码创建一个XTS对象,然后在该对象的生命周期中执行各种cbind操作。我的一些列的名称如“adx-1”。这是好的,直到执行另一个cbind()操作。此时,任何带有“ - ”字符的列都会更改为“。”。所以“adx-1”变成“adx.1”。

重现:

x = xts(order.by=as.Date(c("2014-01-01","2014-01-02")))
x = cbind(x,c(1,2))
x
           ..2
2014-01-01   1
2014-01-02   2

colnames(x) = c("adx-1")
x
           adx-1
2014-01-01     1
2014-01-02     2

x = cbind(x,c(1,2))
x
           adx.1 ..2
2014-01-01     1   1
2014-01-02     2   2

它不只是用数字做这个。它也将“test-text”更改为“test.text”。多个破折号也会改变。 “test-text-two”更改为“test.text.two”。

有人可以解释为什么会发生这种情况,如果可能的话,如何阻止它发生?

我当然可以更改我的命名方案,但如果我没有这样做,那将是首选。

谢谢!

2 个答案:

答案 0 :(得分:2)

merge.xts将列名转换为语法名称,但不能包含-。根据{{​​1}}:

?Quotes

目前无法改变此行为。

答案 1 :(得分:0)

该行为的原因正是约书亚·乌尔里希(Joshua Ulrich)强调的。这在R中的许多数据类型中很常见:您需要“有效”名称。 Here is a great discussion of this "issue".
对于数据帧,您可以通过选项check.names = FALSE作为解决方法,但是xts对象未实现。也就是说,还有许多其他解决方法可供您使用。
例如,您可以仅在cbind之后重命名感兴趣的列。使用您的代码,只需添加:
colnames(x)[1] <- c("adx-1") 强制返回所需的列名称。
另外,如果您想要一些可能更系统的内容,可以考虑使用this gsub solution