R:警告:当我尝试使用我的功能时获得NA

时间:2017-07-28 01:10:52

标签: r function vector na

我是编程的新手,我正在尝试在R中编写一个函数来计算指定监视器列表中污染物(硝酸盐或硫酸盐)的平均值(每个监视器在文件夹“specdata”中都有自己的.csv文件“)。我构建了以下函数:

pollutantmean <- function(directory="specdata", pollutant="sulfate", id=1:332)
{
    files_f<-list.files(directory,full.names=TRUE)
    d <- data.frame()

    for(i in 1:332){ 
        d <- rbind(d,read.csv(files_f[i])) 
    }
    if(pollutant=="sulfate"){ 
        mean(d$Sulfate[which(d$ID==id)], na.rm=TRUE) 
    }
    else{ 
        mean(d$Nitrate[which(d$ID==id)], na.rm=TRUE) 
    }
}

然后我尝试用以下方法测试函数:     pollutantmean(directory="specdata",pollutant="sulfate", id=1:10)

然后我收到以下错误:

[1] NA Warning messages:
1: In d$ID == id :
longer object length is not a multiple of shorter object length
2: In mean.default(d$Sulfate[which(d$ID == id)], na.rm = TRUE) :
argument is not numeric or logical: returning NA

这是什么意思?我已多次查看我的代码,但无法确定问题所在。

谢谢。

1 个答案:

答案 0 :(得分:0)

在这里,我认为我已经在评论中实施了建议,缩短了代码,甚至在你想要调查其他污染物的情况下概括了这个功能(只需确保拼写它们与csv中的相同,包括大写):

   pollutantmean <- function(directory="specdata", 
                              pollutant="Sulfate", 
                              id=1:332){
      files_f <- list.files(directory,full.names=TRUE)
      d <- do.call(rbind, lapply(files_f, read.csv, stringsAsFactors=FALSE))
      mean(d[[pollutant]][which(d$ID %in% id)], na.rm=TRUE)
    }

希望有效,污染物监测好运