如果 headers 是数字,如何按列对 xts-matrix 进行排序

How to sort xts-matrix by column if the headers are numbers

我有两个 xts-matrices(A 和 B)都以 "value1.value2" 的形式包含 headers。 此标签组合为两个矩阵保存为字符,以避免 R 将前缀 "X" 附加到数字。

A 和 B 已经标有它们的符号组合。

现在我想在 A 的右边 hand-side 附加矩阵 B(我使用 C <- cbind(A,B)C <- merge.xts(A,B))。

合并或绑定它们会导致 R 在 headers 前面附加 X。 它无法
撤消 colnames(C) <- as.character(colnames(C))

如果我想将数字用作 headers,我该如何摆脱它(请注意:这不是我正在加载的文件,我试图将输出放在一起)?

作为下一步,我想以递增的方式对列进行排序并尝试:

C <- C[,sort(colnames(C), decreasing = F)]

但是R完全打乱了顺序,似乎随机排列了列。 我也试过 as.data.frame(cbind(A,B)) 并对数据框进行排序,但它没有任何改善。

很高兴收到宝贵的建议。

很遗憾,我无法提供最低工作示例。

非常感谢!

您可以根据来自单个 xts 对象的 colnames 重命名 colnames,或者使用像 substring(colnames(C), 2).

这样的子字符串

创建数据样本:

library(xts)
A <- matrix(1:20, ncol = 2)
colnames(A) <- c("10.20", "20.01")
B <- matrix(20:1, ncol = 2)
colnames(B) <- c("10.10", "10.01")

# as xts objects
A <- as.xts(A, order.by = seq.Date(Sys.Date() - 9, Sys.Date(), by = "day"))
B <- as.xts(B, order.by = seq.Date(Sys.Date() - 9, Sys.Date(), by = "day"))

C <- merge(A, B)

# rename colnames to names before merge to get rid of X in front of name
colnames(C) <- c(colnames(A), colnames(B))

# alternative use substring: 
# colnames(C) <- substring(colnames(C), 2)

C[, sort(colnames(C), decreasing = F)]
           10.01 10.10 10.20 20.01
2020-03-08    10    20     1    11
2020-03-09     9    19     2    12
2020-03-10     8    18     3    13
2020-03-11     7    17     4    14
2020-03-12     6    16     5    15
2020-03-13     5    15     6    16
2020-03-14     4    14     7    17
2020-03-15     3    13     8    18
2020-03-16     2    12     9    19
2020-03-17     1    11    10    20