2016-08-05 88 views
-1

我試圖在R中計算硝酸鹽,硫酸鹽和ID的平均值。我的原始數據框有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) 

當我跑我的數據,而不使用()的函數,但我按行使用行用我的數據,它會給我的平均值。儘管如此,如果我嘗試使用該函數以便它自己完成所有步驟,它將不會標記我錯誤,但它也不會計算任何值,如我的環境中的數據框「prueba」和列函數

我究竟做錯了什麼?

+4

請不要發佈代碼來清除工作區並關閉圖形設備,除非它們是問題的關鍵部分。 – Gregor

+0

@格雷戈爾工作區,走了! :'( –

回答

2

A reproducible example會很好(雖然在這種情況下不是絕對必要的)。

你需要在函數的最後一行最後一行return(means)。 (有些老派[R用戶維護單獨means是OK - R的自動返回return()是否指定或不函數中最後計算的表達式的值 - 但我覺得用return()明確是更好的做法)

colMeans(y[sapply(y, is.numeric)], na.rm=TRUE) 

是一種稍微更緊湊的方式來實現您的目標(儘管如果讓代碼更易於閱讀和理解,稍微冗長一點就沒有問題)。

0

R函數的結果是最後一個表達式的值。你的最後一個表達式是:

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

它可能看起來奇怪的是,該表達式的值爲NULL,但是這是與R. for循環的means載體被弄順序改變了,這意味着BenBolker的建議使用return(.)是正確的(因爲他的建議幾乎總是)。 R中的For循環是函數式編程範例的一個顯着例外。它們提供循環機制(與各種應用函數一樣),但循環內的命令通過副作用在調用環境中發揮作用(與應用函數不同)。

相關問題