2016-08-05 14 views
-1

硝酸塩、硫酸塩、およびIDの平均を計算する関数をRで作成しようとしています。私の元のデータフレームには4つのカラム(日付、硝酸塩、硫酸塩、ID)があります。だから私は(機能を使用せずに自分のデータを実行すると、私は)次のコードエラーではありませんが、どちらかの結果がありませんR

prueba<-read.csv("C:/Users/User/Desktop/coursera/001.csv",header=T) 

columnmean<-function(y, removeNA=TRUE){ #y will be a matrix 
    whichnumeric<-sapply(y, is.numeric)#which columns are numeric 
    onlynumeric<-y[ , whichnumeric] #selecting just the numeric columns 
    nc<-ncol(onlynumeric) #lenght of onlynumeric 
    means<-numeric(nc)#empty vector for the means 
     for(i in 1:nc){ 
      means[i]<-mean(onlynumeric[,i], na.rm = TRUE) 
     } 



} 

columnmean(prueba) 

を設計し、私はそれが私の平均値を与える私のデータを行単位を使用しています。それにもかかわらず、私自身がすべてのステップを実行するように関数を使用しようとすると、私のエラーではありませんが、私の環境ではデータフレーム「プルーバ」と列関数のように計算されません

私は何を間違えているのですか?

+4

問題の重要な部分でない限り、作業領域をクリアしてグラフィックデバイスを閉じるコードを投稿しないでください。 – Gregor

+0

@Gregorワークスペース、行ってしまった! : '( –

答えて

2

reproducible exampleはいいです(この場合は絶対に必要ではありません)。

機能の最後にreturn(means)という最終行が必要です。

colMeans(y[sapply(y, is.numeric)], na.rm=TRUE) 
(しかし、私は明示的に return()を使用して、より良い練習であると感じています。 - - Rは、自動的に return()が指定されているかどうかを関数内で最後に評価された式の値を返すいくつかの古い学校のRのユーザーだけでは meansがOKであることを維持します)

は、あなたの目標を達成するためのややコンパクトな方法です(コードを読みやすく理解しやすいようにすればもう少し冗長になることは間違いありませんが)。

0

R関数の結果は、最後の式の値です。

for(i in 1:nc){ 
      means[i]<-mean(onlynumeric[,i], na.rm = TRUE) 
     } 

それは、その式の値がNULLであることを奇妙に思えるかもしれないが、それはBenBolkerのことを意味し、それはmeansベクトルを順次変更を取得んR.におけるforループである方法、です:あなたの最後の式は、 return(.)を使用するアドバイスは正しいです(彼のアドバイスはほとんど常にです)。 Rのfor-loopsは、関数型プログラミングのパラダイムの特筆すべき例外です。これらはループのためのメカニズムを提供します(さまざまな*適用機能と同じですが)。ループ内のコマンドは、副機能(適用機能とは異なります)を介して呼び出し環境に影響を及ぼします。

関連する問題