我正在通过课程R编程课程。我正在做的任务问题如下:
写一个名为' pollutantmean'的函数。计算指定监视器列表中污染物(硫酸盐或硝酸盐)的平均值。功能“污染物”'有三个参数:'目录','污染物'和' id'。给定矢量监视器ID号,'污染物量'读取监视器'来自'目录中指定目录的颗粒物质数据'参数并返回所有监视器中污染物的平均值,忽略编码为NA的任何缺失值。
此问题的数据集位于: https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip
我得到第一个循环的答案为3.8383,而第二个循环给出正确的答案为4.064。我无法找到由于在第一个函数中完成iv的子集化而发生的差异。我的调试说它应该在函数1中完成的iv子集之后给出相同的行数,就像在函数2中出现的那样。但是有些不同。
功能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)
}
答案 0 :(得分:2)
虽然无论我选择哪种污染物,我都无法获得与您提供的数据/功能相同的答案。但是,通过纠正一些问题,我能够完成这两项功能。您的第一个位于select_pol<-dat[which(dat[,"ID"]==id), ]
行id
,其中==
采用与id
不兼容的多个值(仅与select_pol<-dat[which(dat[,"ID"] %in% id), ]
中的第一个值进行比较,因此警告);您基本上将整个数据帧过滤到1的id值(我认为是第一个),因此平均值只代表其中一个文件。相反,您应该使用%in%
,我认为它会按照您的意图执行(id
将比较ID中的所有值)。但是,我不确定该行要尝试实现的内容,i
中的值与for
循环中的id
相同。如果1: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
}
,那么以下内容会更有效率,因为您无法加载所有332个文件,然后过滤掉一些文件
let gameScene = GameScene()
override func viewDidLoad() {
super.viewDidLoad()
let skView = self.view as! SKView
skView.presentScene(GameScene(fileNamed: "GameScene"))
}