当该cbind函数用于组合 2 个或更多矩阵时,生成的矩阵将继承列名称。下面是一个简单的例子来说明这一事实。我有两个 (2x2) 矩阵m1和m2. 的列m1是a和b;的列m2是c和d。如果 Icbind m1和m2,我将获得一个包含 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
Run Code Online (Sandbox Code Playgroud)
但是,我刚刚意识到,如果矩阵m1和m2包含时间序列数据,则更改后生成的矩阵的命名约定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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的, 的列名M2以它们原来所属的矩阵的名称为前缀,这是我的问题。我想将矩阵保留为时间序列格式,但避免使用新的命名约定。当我阅读 的文档时cbind,我发现了这个deparse.level论点,但没有帮助:
M2 <- cbind(m3, m4, deparse.level = 0)
M2
Run Code Online (Sandbox Code Playgroud)
当然,简单的解决方法是仅创建一个组合原始矩阵的列名称的字符向量,并用它来命名新矩阵的列;然而,我很好奇是否可以对此采取一些措施。
> 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
Run Code Online (Sandbox Code Playgroud)
非常感激你的帮助。
首先cbind是一个通用函数,这意味着每次使用它时,您都会根据对象的类(在您的情况下是 ts )使用(略有)不同版本的 cbind
这可以通过以下方式看出:
\n\n> library(pryr)\n> ftype(cbind)\n[1] "internal" "generic" \nRun Code Online (Sandbox Code Playgroud)\n\n和:
\n\n> methods(cbind)\n[1] cbind.data.frame cbind.ts* cbind.zoo \nRun Code Online (Sandbox Code Playgroud)\n\n所以基本上每次你使用cbindts 对象时,你使用的 cbind 基本上都是cbind.ts。我们看一下源代码:
> getAnywhere(cbind.ts)\nA single object matching \xe2\x80\x98cbind.ts\xe2\x80\x99 was found\nIt was found in the following places\n registered S3 method for cbind from namespace stats\n namespace:stats\nwith value\n\nfunction (..., deparse.level = 1) \n{\n if (deparse.level != 1) \n .NotYetUsed("deparse.level != 1")\n .cbind.ts(list(...), .makeNamesTs(...), dframe = FALSE, union = TRUE)\n}\n<bytecode: 0x0000000006429410>\n<environment: namespace:stats>\nRun Code Online (Sandbox Code Playgroud)\n\n你可以看到上面的.NotYetUsed("deparse.level != 1")部分代码。快速浏览一下有关的文档后.NotYetUsed发现:
\n\n\n为了查明缺失的功能,R 核心团队使用这些函数来查找缺失的 R 函数以及现有 R 函数尚未使用的参数(通常是出于兼容性目的)。
\n
即你不能使用deparse.level除 1 以外的任何东西。这就是为什么你在列名称(矩阵名称)中得到“奇怪”前缀(矩阵名称)的原因。.makeNamesTs。
最后,为了帮助解决你的问题(因为我想了太久了:))你可以使用该cbind.data.frame方法来开始你的ts像这样的对象(这是应用于矩阵的方法):
> cbind.data.frame(m3,m4)\n a b c d\n1 1 6 11 16\n2 2 7 12 17\n3 3 8 13 18\n4 4 9 14 19\n5 5 10 15 20\nRun Code Online (Sandbox Code Playgroud)\n\n但不幸的是,您需要将其再次转换为 ts,正如 @thelatemail 在评论中提到的那样(所以我认为这没有那么有用)。
\n| 归档时间: |
|
| 查看次数: |
1954 次 |
| 最近记录: |