scale()関数から出力される結果の形式について (R技術メモ)

Rでデータの中心化 (Centering) とか標準化 (Standardizing) とかをするのによく使うscale()関数について,出力の形式が見えないところでエラーを起こしていたので,そのことについてメモ.

これまで,scale()関数を使ったデータ編集をしたときは,そのまま直接データフレームに戻していました.(scale()sample1.R)

この状態で,lm()などの関数を使って分析ができます.(scale()sample2.R)

しかし,一部のパッケージ(例として,package::jtoolsのinteract_plot()関数)ではエラーが発生し,結果が出力されません.(scale()sample3.R)

ここで出ているエラーメッセージ (Error: variable ‘Petal.Width_centered’ was fitted with type “nmatrix.1” but type “numeric” was supplied) は,数値形式の (numeric) データが入るところに,マトリクス形式の (nmatrix.1) データが入っているというものでしたが,「そんな形式に変換した覚えはない」という認識だったため,トラブルシューティングに苦戦しました.
データフレームに投入した中心化済み変数をチェックしてみると,まず数値形式ではあることがわかります.ただ,ベクター形式 (vector) ではなく,マトリクス形式 (matrix) としてデータフレームに投入されています.
ですので,データフレームに投入する直前にベクター形式に変換することで回避します.(scale()sample4.R)

この状態で先ほどのinteract_plot()関数を実行すると,エラーなく結果が出力されます. (scale()sample5.R)

どうやら,glm()関数などでも同じようなエラーが起こるようです.
http://r.789695.n4.nabble.com/issue-building-dataframes-with-matrices-td896730.html
scale()関数は便利で使いよいですが,データ形式に注意しないといけないとわかりました.
ちなみにデータフレーム全体にscale()関数を適用する場合も,dataframe()関数で処理しておかないと,データフレーム形式 (data.frame) ではなく,マトリクス形式になってしまうので注意です.(scale()sample6.R)