我正在修古瑟拉课程。我所做的作业问题如下:
编写一个名为“污染平均值”的函数,计算在指定的监视器列表中污染物(硫酸盐或硝酸盐)的平均值。函数“污染”包含三个参数:“目录”、“污染物”和“id”。给定矢量监视器ID号,“污染平均”读取“目录”参数中指定的目录中的“颗粒物质数据”,并在所有监视器中返回污染物的平均值,而忽略任何编码为NA的缺失值。
此问题的数据集如下:https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip
我得到第一个循环的答案为3.8383,而第二个给出正确的答案为4.064。我找不到差异的发生,因为减法,iv做了第一个函数。我的调试说,它应该给出与在函数2中出现的函数1中的iv相同的行数,但是有些地方是不同的。
职能1
pollutantmean<-function(directory, pollutant, id=1:332){
file_list<-list.files(directory, full.names=TRUE)
dat<-data.frame()
mean_select_pol<-c()
for(i in 1:332){
dat<- rbind(dat, read.csv(file_list[i]))
}
select_pol<-dat[which(dat[,"ID"]==id), ]
mean_select_pol<-mean(select_pol[, pollutant], na.rm=TRUE)
mean_select_pol
}职能2
pollutantmean <- function(directory, pollutant, id = 1:332) {
files <- list.files(directory, full.names=TRUE)
dat <- data.frame()
for(i in id)
{
dat <- rbind(dat, read.csv(files[i]))
}
mean_data <- mean(dat[,pollutant], na.rm = TRUE)
round(mean_data, digits=3)
}发布于 2015-08-12 21:53:41
尽管我无法得到与你相同的答案,但无论我选择哪种污染物,提供的数据/函数都是一样的。然而,我能够通过纠正几个问题来实现这两个功能。第一个是在select_pol<-dat[which(dat[,"ID"]==id), ]行中,您的id接受与==不兼容的多个值(与id中的第一个值相比较,因此发出警告);您实际上是将整个数据过滤为1的id值(我认为是第一个),因此平均值只表示其中的一个文件。相反,您应该使用select_pol<-dat[which(dat[,"ID"] %in% id), ],我认为它将完成您想做的事情(%in%将比较id中的所有值)。但是,我不知道这一行试图实现什么,您的id中的值与for循环中的i相同。如果id并不总是1:332,那么下面的代码将更高效,因为您不会加载所有332个文件,然后过滤掉一些文件
pollutantmean<-function(directory, pollutant, id=1:332){
file_list<-list.files(directory, full.names=TRUE)
dat<-data.frame()
mean_select_pol<-c()
for(i in id){
dat<- rbind(dat, read.csv(file_list[i]))
}
mean_select_pol<-mean(dat[, pollutant], na.rm=TRUE)
mean_select_pol
}https://stackoverflow.com/questions/31975570
复制相似问题