【问题标题】:For loop answer not matching the correct answer. Difference unidentified between the two loops' working [duplicate]For 循环答案与正确答案不匹配。两个循环的工作之间的差异不明[重复]
【发布时间】:2015-11-05 16:10:15
【问题描述】:

我正在学习 coursera R 编程课程。我正在做的作业问题如下:

编写一个名为“pollutantmean”的函数,计算指定监视器列表中污染物(硫酸盐或硝酸盐)的平均值。函数“pollutantmean”接受三个参数:“directory”、“pollutant”和“id”。给定一个向量监视器 ID 号,“pollutantmean”从“目录”参数中指定的目录中读取该监视器的颗粒物数据,并返回所有监视器中污染物的平均值,忽略编码为 NA 的任何缺失值。

这个问题的数据集在这里: https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip

我得到的第一个循环的答案是 3.8383,而第二个循环的正确答案是 4.064。由于 iv 在第一个函数中完成的子集化,我无法找到发生的差异。我的调试说它应该在函数 1 中完成的子集后给出与函数 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)
}

【问题讨论】:

  • 是的,但我没有得到答案,所以我不得不发布它。我在学习阶段,没有得到答案是信心破灭。
  • 好的,感谢您的澄清。
  • Akrun 你能看看它并帮助我解决这个问题吗?
  • 正确的做法是编辑您的原始问题以清楚起见,然后请求重新打开它。
  • 这条线应该做什么? select_pol&lt;-dat[which(dat[,"ID"]==id), ]

标签: r for-loop functional-programming


【解决方案1】:

虽然无论我选择哪种污染物,我都无法通过所提供的数据/函数得到与您相同的答案。但是,我能够通过纠正几个问题来实现这两个功能。您的第一个在select_pol&lt;-dat[which(dat[,"ID"]==id), ] 行中,您的id 具有多个与== 不兼容的值(仅与id 中的第一个值比较,因此出现警告);您实际上是将整个数据框过滤为 id 的 1 个值(我认为是第一个),因此平均值仅代表一个文件。相反,您应该使用select_pol&lt;-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
}

【讨论】:

  • 感谢我渴望数小时的解释,雷米。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多