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

问题描述 投票:2回答:2

我有一些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-two”更改为“ test.text.two”。

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

我当然可以更改我的命名方案,但是如果不需要的话,则更可取。

谢谢!

r xts cbind
2个回答
2
投票

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.

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


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

© www.soinside.com 2019 - 2024. All rights reserved.