对于循环答案不匹配正确的答案。两个循环之间未知的差异'工作的

时间:2015-08-12 21:16:55

标签: r for-loop functional-programming

我正在通过课程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)
}

1 个答案:

答案 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"))
}