2016-09-22 4 views
0

各列のレベルを詳述するデータフレームに要約行を追加しようとしています。フレーム全体でレベル関数を適用する際に問題が発生しました。私は、その理由が個別に扱わ列は因子ベクトルとして扱われることであると思うが、適用機能を使用する場合、それらは文字として扱われます。データフレームの列がサブセット化されて適用されるときにクラスを変更するのはなぜですか?

levels(df[,1]) 
[1] "a" "b" "c" 
apply(df, MARGIN=2, levels) 
NULL 
:私は、問題の原因だと思う

a = c("a","b","c") 
b = c("d","e","f") 
m = cbind(a,b) 
df = as.data.frame(m) 
class(df[,1]) 
[1] "factor" 
apply(df, MARGIN=2, class) 
      a   b 
"character" "character" 

私は、適用、データフレーム、およびウェブのヘルプドキュメントを見てきました。誰かがこれがなぜなのか説明できますか?

+0

apply'がmatrix' 'にあなたのdata.frameを強制的に変換し、それらが唯一、すべての「列」で1つのクラスを持つことができます'ので、これが起こる(彼らはしているので、 –

+1

そして '?matrix'から: 'as.matrix'のデフォルトのメソッドは 'as.vector(x)'を呼び出します。ファクタを文字ベクトルに強制します。 –

+0

最初に適用して、すべてのデータが数値かどうかを確認します。それが 'as.matrix'を呼び出すならば。そうでなければ 'as.array'を呼び出します。しかし、 'as.array'は@WeihuangWongが示した変換を行う' as.vector'を呼び出します。 –

答えて

0

変数のクラスを知るためにlapply関数またはsapply関数を使うことができます。私の理解には列要素を賢明に使うため、各要素は文字なので、出力は文字として表示されます。lapply関数とsapply関数は変数それは、変数のクラスを与えるのいずれかの文字または因子として

lapply(df,class) 
$a 
[1] "factor" 

$b 
[1] "factor" 

sapply(df,class) 
     a  b 
"factor" "factor" 
関連する問題