我是编程的新手,我正在尝试在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
这是什么意思?我已多次查看我的代码,但无法确定问题所在。
谢谢。
答案 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)
}
希望有效,污染物监测好运