Использование cbind для объекта XTS изменяет символ тире (-) в именах предыдущих столбцов на точку (.)

У меня есть код 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".

Может кто-нибудь объяснить, почему это происходит и, если возможно, как это предотвратить?

Я, конечно, могу изменить свои схемы именования, но было бы предпочтительнее, если бы мне не приходилось этого делать.

Спасибо!


person Patrick    schedule 16.09.2014    source источник


Ответы (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.

В настоящее время нет способа изменить это поведение.

person Joshua Ulrich    schedule 16.09.2014

Причина такого поведения как раз та, которую выделил Джошуа Ульрих. Это характерно для многих типов данных в R: вам нужны «действительные» имена. Вот отличное обсуждение этой "проблемы".
Для фреймов данных вы можете передать опцию check.names = FALSE в качестве обходного пути, но это не реализовано для объекта xts. При этом вам доступно множество других обходных путей.
Например, вы можете просто переименовать интересующие столбцы после очень cbind. Используя свой код, просто добавьте:
colnames(x)[1] <- c("adx-1"), чтобы вернуть желаемое имя столбца.
В качестве альтернативы вы можете рассмотреть это gsub решение, если вы хотите что-то потенциально более систематическое.

person tchevrier    schedule 28.10.2019