2014-05-19 24 views
1

鏈接,CSV文件的ZIP我使用:R:當串聯CSV文件,並獲得平均1個可變我得到正確的答案1個文件,但不正確的序列

https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip

代碼:

getpollutant <- function(id=1:332, directory, pollutant) { 
    data<-NULL 
    for (i in 1:length(id)) { 
      data[[i]]<- c(paste(directory, "/",formatC(id[i], width=3, flag=0),".csv",sep=""))  
    } 
    df<-NULL 
    for (d in 1:length(data)) { df[[d]]<-c(read.csv(data[d])) 
    } 
    m<-NULL 
    for (i in 1:length(df)) { 
      if (pollutant=="nitrate"){ 
        m<-mean(df[[i]]$nitrate, na.rm=T) 
      } 
      if (pollutant=="sulfate"){ 
        m<-mean(df[[i]]$sulfate, na.rm=T) 
      } 


    } 
    m 

}

當我使用getpollutant計算1個文件的污染物意味着硝酸鹽或硫酸鹽我得到正確的答案,但這麼當我嘗試輸入文件序列時,我的理由是我的意思太高了,我有一種感覺,它與NA值的處理方式有關,但我無法找到一種方法將NA值包含在平均值中計算

+0

如果您希望包含NA值,請首先編寫一個新的數據幀,您可以用0代替NA值,例如, 'df $硝酸鹽[is.na(df $硝酸鹽)] < - 0'。 – Alex

回答

2

在您上一次的循環中,您不斷重申文件的含義爲m。這意味着m將始終具有您讀取的最後一個文件的含義。你沒有努力在文件間合併數據。如果你願意,你可以收集所有數據點的矢量,再取平均值在最後像

#before loop 
v <- numeric() 
#in loop 
v <- c(v, df[[i]]$sulfate) 
#after loop 
mean(v, na.rm=T) 

或者你可以存放款項和長度來計算意味着自己。

#before loop 
total<-0; N<-0; 
#in loop 
total <- total + sum(df[[i]]$sulfate, na.rm=T) 
N <- N + sum(!is.na(df[[i]]$sulfate)) 
#after loop 
total/N 
+0

謝謝!我只是一名初學者,在長時間在Python中工作後,習慣於習慣R語言。這非常有幫助! – user3653647

相關問題