【问题标题】:function not producing correct mean output in R函数没有在 R 中产生正确的平均输出
【发布时间】:2015-07-17 14:11:57
【问题描述】:

我正在为 Coursera 上的 r 编程课程做家庭作业。我有一个包含 332 台监视器的天气数据读数的目录。它是 4 个变量的 172,385 个观测值。变量或日期、硫酸盐、硝酸盐和监视器 ID。我已经编写了下面的函数并让它工作,但它没有返回正确的值。这是我第一次真正的编程体验,这是一项家庭作业,所以我真的只是在寻找关于我做错了什么的提示或建议。

这是我的功能:

polutantmean14 <- function(directory, polutant = "nitrate", id = 1:332) {
  files_list <- list.files(directory, full.names = TRUE)
  dat <- data.frame()
  for ( i in 1:332) {
    dat <- rbind(dat, read.csv(files_list[i]))
  }
  dat_subset <- dat[which(dat[, "ID"] == id), ]
  mean(dat_subset[, polutant], na.rm= TRUE)
}

这是我得到的错误:

polutantmean14("specdata", polutant = "硫酸盐", id = 1:10)

[1] 3.838328

警告信息: 在 dat[, "ID"] == id 中: 较长的对象长度不是较短对象长度的倍数

该函数返回 3.838328,但对于给定的参数,我应该得到 4.064。

就像我之前提到的,我是编程新手,这是家庭作业,所以我真的只是在寻找关于我的错误在哪里的建议和指导。

【问题讨论】:

  • id 是来自 1:332 的向量...所以你不能将它与 == 进行比较
  • 与您的问题无关,但您在函数中将 id=1:332 作为默认值,但在您的 for 循环中,它被硬编码为 1:332 而不是使用 id 变量。

标签: r function statistics


【解决方案1】:

尝试使用%in% 而不是==。

【讨论】:

  • 好的,所以我将 == 换成了 %in% 并且它起作用了,给了我应该得到的所有答案。我的下一个问题是为什么?两者之间有什么区别,为什么 %in% 会在 == 不起作用时起作用?
  • a %in% b 在向量 b 中查找 a 并返回 TRUE 如果它在某处。但要小心:如果a 是长度>1 的向量,则将返回TRUEs 和FALSEs 的向量。为了安全起见,您可以使用if(sum(a %in% b, na.rm = T) != 0),这意味着a 的至少一个元素与b 的至少一个元素匹配。
  • 你可以使用任何而不是 sum !=0
【解决方案2】:

您正在将长度为 332 的向量与长度为 10 的向量进行比较。

R(与 MATLAB 不同)可以让您比较不同长度的向量,但如果较长向量的长度不是较短向量长度的倍数,则会发出警告。那就是如果mod(length(longerVec),length(shorterVec)) != 0

长话短说:重新思考并重写您的代码。 ;-)

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    相关资源
    最近更新 更多