2016-07-06 8 views
1

データフレームの数値列の歪度を求めようとしています。次のコードで使用されるapply関数はNULLを返します。ただし、関数を列のいずれかに直接使用すると、値が返されます。NULLを返す関数の適用

library(mlbench) 
data(Glass) 
funNum= function(x){ 
    if(is.numeric(x)){return(skewness(x)) 
    } 
} 

funNum(Glass$Na) 
# [1] 0.4478343 

apply(Glass,2,funNum) 
# NULL 

上記のコードが間違っていることをお勧めします。前もって感謝します!何が起こることはapplyある

+0

「適用する(a、2、is.numeric)」とは何ですか? – Carl

+0

'apply(a、2、is.numeric) RI Na Mg Al Si K Ca Baタイプ 偽偽偽偽偽偽偽[ – Apoorv

+0

[最小](http://stackoverflow.com)を入力してください。/help/mcve)と[reproducible](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)の例です。これらのリンクの少なくとも1つをスキミングした後、使用されるサンプルデータとコード(スキューネスなど)を提供してください。コメントを追加するのではなく、あなたの質問を編集してください、ありがとう! – r2evans

答えて

2
をマトリクスに強要することなく、

sapply(a,funNum) 

aの列の上にこの意志ループを試してみてくださいNULLを返しますので、文字に数字の列に変換します

ええ、コメントの私の推測は正しいです:あなたは要因があります!

sapply(Glass, class) 
#  RI  Na  Mg  Al  Si   K  Ca  Ba 
# "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" 
#  Fe  Type 
# "numeric" "factor" 

あなたがapply()を使用する場合、それが第1の行列にGlassを強要されます。ベクトルのような行列は、1種類のデータしか保持できません。さて、あなたのデータフレームは数値と因子の両方を持っています。結果の行列は文字のみになります。 skewness()は、この場合は何もしません。列のいずれも数字ではありません(したがって、NULLが得られます)。

sapply()またはlapply()を使用すると、状況が異なります。これらの機能は、リスト/データフレームで機能するように設計されています。すべての数値列に対して有効な結果が得られます。

sapply()またはlapply()を使用するかどうかは、必要なものによって異なります。 sapply()は可能な限りベクトル/行列を返し、lapply()はリストを返します(デフォルト)。私は、skewness()はスカラー結果しか返さないと考えたので、sapply()を使用することをお勧めします。これによってベクトルが完成します。データフレームが必要な場合は、代わりにas.data.frame(lapply(Glass, skewness))を使用してください。

+0

'apply(a [、1:9]、2、funNum)'を実行することもできます。 'factor'カラムを省略することで変換を行います。 – r2evans

+0

多くのありがとう:) – Apoorv

+0

合意。残念ながら、両方ともdata.frameではなく 'matrix'を返します。 'lapply'は、少なくとも' data.frame'や 'plyr'や' dplyr'で提供されているような 'data.frame'に特有の関数に近いので良い適合性を持つかもしれませんが、要求された。 – r2evans

0

は、マトリックスに強制的に変換し、あなたの関数が

+0

すべての列が数値型であり、正しい結果を返したときに強制終了しません。 – Apoorv

+0

これは、すべての数値がDFの場合に数値行列に強制するからです。 – Carl

関連する問題