理由を理解するには、test_mx = cast(melt(dat, id.vars="t"), variable ~ t)
の行に戻ってください。ここでは2つのオブジェクトを作成していくつかの比較を行います:
test_mx <- test_mx_cast <- cast(melt(dat, id.vars="t"), variable ~ t)
class(test_mx)
# [1] "cast_df" "data.frame"
class(test_mx_cast)
# [1] "cast_df" "data.frame"
Hmm。これはcast_df
クラスとは何ですか? 「再形成」メソッドがいくつかの新しいメソッドに移行し、定義されていることが判明しました。例えば、methods(as.data.frame)
又はmethods(as.matrix)
を参照:
> methods(as.matrix)
[1] as.matrix.cast_df as.matrix.cast_matrix as.matrix.data.frame as.matrix.default
[5] as.matrix.dist* as.matrix.noquote as.matrix.POSIXlt as.matrix.raster*
Non-visible functions are asterisked
> methods(as.data.frame)
[1] as.data.frame.aovproj* as.data.frame.array as.data.frame.AsIs
[4] as.data.frame.cast_df as.data.frame.cast_matrix as.data.frame.character
[7] as.data.frame.complex as.data.frame.data.frame as.data.frame.Date
[10] as.data.frame.default as.data.frame.difftime as.data.frame.factor
[13] as.data.frame.ftable* as.data.frame.function* as.data.frame.idf*
[16] as.data.frame.integer as.data.frame.list as.data.frame.logical
[19] as.data.frame.logLik* as.data.frame.matrix as.data.frame.model.matrix
[22] as.data.frame.numeric as.data.frame.numeric_version as.data.frame.ordered
[25] as.data.frame.POSIXct as.data.frame.POSIXlt as.data.frame.raw
[28] as.data.frame.table as.data.frame.ts as.data.frame.vector
Non-visible functions are asterisked
注意^^上記as.data.frame
ためas.matrix
と第四及び第五の方法のための第一及び第二の方法。
これはどういう意味ですか?さて、test_mx
を作成してdata.frame
をmatrix
に変換した後、いくつかの行を書きました。これは、ほとんどの場合、最初の列がrownames
となってしまったことを確認し、行列全体を文字マトリックスに強制しないためです。
tmp_rownames = as.character(test_mx[,1])
test_mx = test_mx[,-1]
tmp_colnames = colnames(test_mx)
test_mx = as.matrix(test_mx)
rownames(test_mx) = tmp_rownames
colnames(test_mx) = tmp_colnames
test_mx
# 0 1 2 3
# a1 -0.079811371 0.82820704 -0.193860367 -1.1269632
# b1 -0.009402418 -1.19348155 -0.004519269 0.8921427
# c1 -0.784163111 -0.01340952 0.966208235 0.0135557
「再構築」は、すでにあなたが実際にそれを行う必要はありませんでした、カスタマイズされたas.matrix
メソッドを定義しているので!
as.matrix(test_mx_cast)
# 0 1 2 3
# a1 -0.079811371 0.82820704 -0.193860367 -1.1269632
# b1 -0.009402418 -1.19348155 -0.004519269 0.8921427
# c1 -0.784163111 -0.01340952 0.966208235 0.0135557
しかし、それでもすべてが正確には答えられません。さらに理解するために、2つの行列を今比較する:
> test_mx_cast_matrix <- as.matrix(test_mx_cast)
> class(test_mx)
[1] "cast_matrix" "matrix"
> class(test_mx_cast_matrix)
[1] "cast_matrix" "matrix"
> str(test_mx)
num [1:3, 1:4] -0.0798 -0.0094 -0.7842 0.8282 -1.1935 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:3] "a1" "b1" "c1"
..$ : chr [1:4] "0" "1" "2" "3"
> str(test_mx_cast_matrix)
num [1:3, 1:4] -0.0798 -0.0094 -0.7842 0.8282 -1.1935 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:3] "a1" "b1" "c1"
..$ : chr [1:4] "0" "1" "2" "3"
- attr(*, "idvars")= chr "variable"
- attr(*, "rdimnames")=List of 2
..$ :'data.frame': 3 obs. of 1 variable:
.. ..$ variable: Factor w/ 3 levels "a1","b1","c1": 1 2 3
..$ :'data.frame': 4 obs. of 1 variable:
.. ..$ t: int [1:4] 0 1 2 3
Hmmm。 as.matrix
を直接使用すると、 "reshape"パッケージが追加するattributes
のすべてが保持されますが、手作業では同じclass
と表示されますが、すべてのカスタムattributes
は削除されています。
だから何ですか?Rは、あなたがas.data.frame
を呼び出すときtest_mx
は、cast_matrix
あると思うので、
まあ、それは実際にas.data.frame.cast_matrix
、ないas.data.frame.matrix
呼び出します。
as.data.frame.cast_matrix
が定義されているかを見てみると、それらのattributes
は不可欠再作成するためにあなたのdata.frame
、したがって、あなたのエラーがあります。ここでは、関数の中身は以下のとおりです。
> as.data.frame.cast_matrix
function (x, row.names, optional, ...)
{
unx <- unclass(x)
colnames(unx) <- rownames(rcolnames(x))
r.df <- data.frame(rrownames(x), unx, check.names = FALSE)
class(r.df) <- c("cast_df", "data.frame")
attr(r.df, "idvars") <- attr(x, "idvars")
attr(r.df, "rdimnames") <- attr(x, "rdimnames")
rownames(r.df) <- 1:nrow(r.df)
r.df
}
<environment: namespace:reshape>
だから、あなたは今、3つのオプションがあります:「reshape2」へ
アップグレード - 良いアドバイスが、良いがまだあることを心に留めておくと切り替えを気にしていない人の数。
str
、class
、およびattributes
で作成したオブジェクトをもう少し見る必要がある「変形」を正しく使用してください。ここで「正しく」使用するとas.data.frame(test_mx_cast_matrix)
を使用していました。
あなたが使用したいmethod
を指定します(これは、パッケージが再定義メソッドであるかどうかわからないときにはかなり安全です。新しいクラスを作成するときには、新しいメソッドが作成されているか)。比較:
> as.data.frame(test_mx) ## Calls `as.data.frame.cast_matrix` ERROR!
Error in data.frame(rrownames(x), unx, check.names = FALSE) :
arguments imply differing number of rows: 0, 3
> as.data.frame.matrix(test_mx) ## Specifies the `as.data.frame` method. WORKS!
0 1 2 3
a1 -0.079811371 0.82820704 -0.193860367 -1.1269632
b1 -0.009402418 -1.19348155 -0.004519269 0.8921427
c1 -0.784163111 -0.01340952 0.966208235 0.0135557
ため息。最後に....
私は 'test_mx = cast(melt(dat、id.vars =" t ")、変数〜t)'を使いました。 'パッケージ。それがなければ、私は 'エラー:関数を見つけることができませんでした 'というキャストを取得します。 – mpettis
私は[この回答で](http://stackoverflow.com/a/17873683/1270695)で説明したように、 'class'とそれに関連する' methods'を見てください。 – A5C1D2H2I1M1N2O1R2T1
また、今後、あなたのコードから厄介な '>'と '+'記号を削除して、コードをコピー&ペーストしてテストしにくくしてください! – A5C1D2H2I1M1N2O1R2T1