2012-03-16 5 views
2

私は今日何か奇妙なものを見つけました。私が見ているものが論理的な理由があるか、あるいはこれがバグだと思ったらR-develのチームに報告すべきではない:as.matrixは空のdata.frameのデータモードを保持していません

df <- data.frame(a = 1L:10L) 
class(df$a) 
# [1] "integer" 
m <- as.matrix(df) 
class(m[, "a"]) 
# [1] "integer" 

ませ驚き、これまで:as.matrixは「整数」ここでは、データモードを保持します。ただし空の(行がない)data.frame:

df <- data.frame(a = integer(0)) 
class(df$a) 
# [1] "integer" 
m <- as.matrix(df) 
class(m[, "a"]) 
# [1] "logical" 

ここで、モードが「整数」から「論理」に変更される理由はありますか?バージョン2.13.1を使用しています

ありがとうございます。

+0

R-develに投稿する前に、それがなぜ起こるのかわからないが、最新のスナップショットでテストする方がよい。彼らはRの6ヶ月の古いバージョンで "バグレポート"を評価しません。 –

+0

私はRバージョン2.14.1(2011-12-22)と同じ動作をします。 –

+0

そして私は2.14.2で同じことを見る – joran

答えて

4

これはas.matrix.data.frameで、この1行である:任意の次元がゼロであれば基本的に、あなたはNAの「完全な」配列を取得

if (any(dm == 0L)) return(array(NA, dim = dm, dimnames = dn)) 

。次元の1つがゼロであるため、実際には何の観測もないので、「完全」と言います。

クラスがlogicalの理由は、それがNAのクラスだからです。他のクラスには特別なNAがありますが、ここでは本当に必要ありません。例:

> class(NA) 
[1] "logical" 
> class(NA_integer_) 
[1] "integer" 
> class(NA_real_) 
[1] "numeric" 
> class(NA_complex_) 
[1] "complex" 
> class(NA_character_) 
[1] "character" 
+0

ジョシュアありがとう、私はあなたのようにRのベースコードに自分の道を見つける方法を知りたがっていればいいと思う。私は 'print(as.matrix)'で停止しました... – flodel

+2

@flodel: 'print(as.matrix)'は 'UseMethod(" as.matrix ")'を示していますので、 'methods(as.matrix) '。次に 'print(as.matrix.data.frame)'を使ってdata.frameメソッドを見ることができます。メソッドが「見えない」場合は、 'getAnywhere'を使用できます(例えば、' getAnywhere( "as.matrix.dist") ')。 –

+0

これらは将来私にとって非常に役立ちます。フォローアップのジョシュアに感謝します。 – flodel

関連する問題