R 使用cbind和命名时间序列矩阵

R 使用cbind和命名时间序列矩阵,r,cbind,R,Cbind,当使用cbind函数组合2个或多个矩阵时,生成的矩阵将继承列名。这一事实的一个简单例子如下。我有两个(2x2)矩阵m1和m2。m1的列是a和b;m2的列是c和d。如果我cbindm1和m2,我将获得一个包含4列的矩阵,分别命名为:a、b、c和d > m1 <- matrix(1:10, ncol = 2) > colnames(m1) <- letters[1:2] > m2 <- matrix(11:20, ncol = 2) > colnames(m

当使用
cbind
函数组合2个或多个矩阵时,生成的矩阵将继承列名。这一事实的一个简单例子如下。我有两个(2x2)矩阵
m1
m2
m1
的列是
a
b
m2
的列是
c
d
。如果我
cbind
m1
m2
,我将获得一个包含4列的矩阵,分别命名为:
a
b
c
d

> 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
如您所见,
M2
的列名以它们最初所属矩阵的名称作为前缀,这是我的问题。我希望保持时间序列格式的矩阵,但避免使用新的命名约定。在阅读
cbind
的文档时,我发现了
deparse.level
参数,但它没有任何帮助:

M2 <- cbind(m3, m4, deparse.level = 0)
M2
M2列名称colnames(M2)M2
时间序列:
开始=1
结束=5
频率=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
是一个通用函数,意味着每次使用它时,您都会根据对象的类别使用(稍微)不同的cbind版本(在您的情况下为ts)

这可以从以下几个方面看出:

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

因此,基本上每次对ts对象使用
cbind
时,您使用的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>

但不幸的是,您需要再次将其转换为@thelatemail在注释中提到的ts(因此我认为这没有多大帮助)。

as.ts(cbind.data.frame(m3,m4))
给出了相同的结果,但我不确定这是否比您已经在做的事情简单。如果您使用
“zoo”
系列而不是
“ts”
series,则命名将按要求进行:
library(zoo);z3@thelatemail非常感谢。我从未听说过
cbind.data.frame
函数。这将是非常有帮助的@格罗森迪克谢谢你的回答。
zoo
序列和时间序列一样吗?它们是与R中的类时间序列函数一起工作,还是包有自己的函数集?我一定会尝试了解更多关于它的信息?zoo软件包基于ts的思想,主要为ts使用的相同泛型函数提供方法。如果您想了解更多信息,该软件包附带了几个vignette(pdf文档)。不过,这并不能使矩阵保持OP明确要求的
ts
格式。因此,您需要根据我的评论将其包装为
as.ts
。@TheLate Mail感谢您的评论。你完全正确,是的。根据你的评论,我在最后提到了这一点,但事实上,这对OP想要什么没有多大帮助。我只是想进一步了解一下使用
cbind
函数时会发生什么。没问题,你写的所有东西都是有用的信息,我投了赞成票。“我只是觉得需要最后一次提及才能把这一切总结起来。”莱尚德没有什么比这样详细而翔实的回答更令人满意的了。我感谢你!谢谢你回答我的问题,同时也教我R!非常感谢您的友好和慷慨的评论。知道它很受欢迎肯定会有所帮助:)。我真的很高兴我能帮上忙:)。
> library(pryr)
> ftype(cbind)
[1] "internal" "generic" 
> methods(cbind)
[1] cbind.data.frame cbind.ts*        cbind.zoo  
> 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>
> 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