gpt4 book ai didi

r - 使用 cbind 并命名时间序列矩阵

转载 作者:行者123 更新时间:2023-12-02 21:17:47 27 4
gpt4 key购买 nike

当使用cbind函数组合2个或更多矩阵时,生成的矩阵将继承列名称。下面是一个简单的例子来说明这一事实。我有两个 (2x2) 矩阵 m1m2m1 的列是 abm2 的列是 cd。如果我 cbind m1m2,我会获得一个包含 4 列的矩阵,名称为:a, b cd

> m1 <- matrix(1:10, ncol = 2)
> colnames(m1) <- letters[1:2]
> m2 <- matrix(11:20, ncol = 2)
> colnames(m2) <- letters[3:4]
>
> M <- cbind(m1, m2)
> M
a b c d
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20

但是,我刚刚意识到,如果矩阵 m1m2 包含时间序列数据,则 cbind 之后生成的矩阵的命名约定> 更改。

> m3 <- ts(m1)
> m4 <- ts(m2)
> M2 <- cbind(m3, m4)
> M2
Time Series:
Start = 1
End = 5
Frequency = 1
m3.a m3.b m4.c m4.d
1 1 6 11 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 15 20

如您所见,M2 的列名以它们原来所属的矩阵的名称为前缀,这是我的问题。我想将矩阵保留为时间序列格式,但避免使用新的命名约定。当我阅读 cbind 的文档时,我发现了 deparse.level 参数,但它没有任何帮助:

M2 <- cbind(m3, m4, deparse.level = 0)
M2

当然,简单的解决方法是创建一个组合原始矩阵的列名称的字符向量,并用它来命名新矩阵的列;但是,我很好奇是否可以对此采取措施。

> column_names <- c(colnames(m3), colnames(m4))
> colnames(M2) <- column_names
> M2
Time Series:
Start = 1
End = 5
Frequency = 1
a b c d
1 1 6 11 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 15 20

非常感谢您的帮助。

最佳答案

首先,cbind 是一个通用函数,这意味着每次使用它时,您都会根据对象的类(在您的情况下为 ts)使用(略有)不同版本的 cbind

这可以通过以下方式看到:

> library(pryr)
> ftype(cbind)
[1] "internal" "generic"

还有:

> methods(cbind)
[1] cbind.data.frame cbind.ts* cbind.zoo

因此,基本上每次将 cbind 与 ts 对象一起使用时,您使用的 cbind 本质上都是 cbind.ts。我们看一下源代码:

> getAnywhere(cbind.ts)
A single object matching ‘cbind.ts’ was found
It was found in the following places
registered S3 method for cbind from namespace stats
namespace:stats
with value

function (..., deparse.level = 1)
{
if (deparse.level != 1)
.NotYetUsed("deparse.level != 1")
.cbind.ts(list(...), .makeNamesTs(...), dframe = FALSE, union = TRUE)
}
<bytecode: 0x0000000006429410>
<environment: namespace:stats>

您可以在上面看到代码的 .NotYetUsed("deparse.level != 1") 部分。快速浏览一下有关 .NotYetUsed 的文档后发现:

In order to pinpoint missing functionality, the R core team uses these functions for missing R functions and not yet used arguments of existing R functions (which are typically there for compatibility purposes).

即您不能将 deparse.level 与 1 以外的任何值一起使用。这就是为什么您会在列名称(.makeNamesTs)中看到“奇怪”前缀(矩阵的名称) > 可能就是这样。

最后,为了帮助解决您的问题(因为我想了太久了:))您可以在您的 上使用 cbind.data.frame 方法像这样的 ts 对象(这是应用于矩阵的方法):

> cbind.data.frame(m3,m4)
a b c d
1 1 6 11 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 15 20

但是不幸的是,您需要将其再次转换为 ts,正如 @thelatemail 在评论中提到的那样(所以我认为这没有那么有用)。

关于r - 使用 cbind 并命名时间序列矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29526565/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com