2

このcbind関数を使用して 2 つ以上の行列を結合すると、結果の行列は列名を継承します。この事実の簡単な例は次のとおりです。2 つの (2x2) 行列m1m2. の列m1abです。の列m2cdです。Icbind m1との場合、、 、m2という名前の 4 つの列を持つ行列を取得します。abcd

> 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

m1ただし、行列とm2に時系列データが含まれている場合、 a の後の結果の行列の命名規則が変更されることに気付きました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

よろしくお願いいたします。

4

1 に答える 1

5

まず第一に、cbindそれを使用するたびに、オブジェクトのクラスに応じて(わずかに)異なるバージョンの cbind を使用することを意味する汎用関数です(あなたの場合は ts )

これは次の方法で確認できます。

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

と:

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

したがって、基本的に 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>

.NotYetUsed("deparse.level != 1")コードの一部の上を見ることができます。についてのドキュメントをざっと見てみると、次の.NotYetUsedことが明らかになります。

不足している機能を特定するために、R コア チームはこれらの関数を不足している R 関数に使用し、既存の R 関数の引数をまだ使用していません (これらは通常、互換性のために存在します)。

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

ただし、残念ながらコメントで@thelatemailが述べているように、それを再度tsに変換する必要があります(そのため、あまり役に立たないと思います)。

于 2015-04-08T23:06:14.797 に答える