2

我有一些创建 XTS 对象的 R 代码,然后在该对象的生命周期中执行各种 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”。

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

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

谢谢!

4

2 回答 2

3

merge.xts将列名转换为不能包含-. 根据?Quotes

 Identifiers consist of a sequence of letters, digits, the period
 ('.') and the underscore.  They must not start with a digit nor
 underscore, nor with a period followed by a digit.

目前没有办法改变这种行为。

于 2014-09-16T16:07:38.493 回答
1

这种行为的原因正是 Joshua Ulrich 强调的原因。它在许多数据类型中很常见R:您需要“有效”名称。这是对这个“问题”的精彩讨论。
对于数据框,您可以将选项check.names = FALSE作为解决方法传递,但这不适用于xts对象。这就是说,还有很多其他的解决方法可供您使用。
例如,您可以简单地在 very 之后重命名感兴趣的列cbind。使用您的代码,只需添加:
colnames(x)[1] <- c("adx-1") 强制返回您想要的列名。或者,如果您想要更系统的东西
,您可以考虑这个gsub解决方案。

于 2019-10-28T04:14:53.910 回答