【问题标题】:Failing to ignore NAs in my list of files未能忽略我的文件列表中的 NA
【发布时间】:2025-12-14 16:50:02
【问题描述】:

我的目录中有一个文件列表(从 1 到 332)。 file1对应id1,file2对应id2,以此类推。

每个文件包含 4 列,我必须通过忽略 NA 来计算第 2 列(标记为“污染物”)的总和和长度。

我已经尝试了所有方法:!is.na(file), na.rm = TRUE, omit...当我想要从 1:100 或 1:60 的总和和长度(从值 1 到另一个值),但例如从 70:72 开始不起作用。我无法确定问题所在。

这是我处理它的代码部分:

pollutantmean <- function(directory,pollutant,id= 1:332){

  files <- list.files(directory)
  sums <- numeric (length(id))
  lengths <- numeric (length(id))
  means <- numeric (length(id))

  for (i in id){

      file <- read.csv(files[i])[,pollutant]
      sums[i] <- sum(file,na.rm = TRUE)
      lengths[i] <-length(file[!is.na(file)])
  }

  means <-(sum(sums)/sum(lengths))
  return(list(sums, lengths, means))

}

提前感谢您的帮助!

【问题讨论】:

  • 能否分享一个上面确实失败的代码sn-p?
  • @Edwin:我编辑我的问题以包含上面的整个代码。
  • @jogo 是的,我希望手段是一个单一的价值。当我通过键入以下内容运行脚本时:污染物均值(“。”,“硫磺”,1:10)我得到了很好的平均值。但是,当我输入:pollutionmean(".","sulf",70:72) 时,我得到的答案是“NA”
  • 好的。但是你为什么要初始化 means &lt;- numeric (length(id)) 呢?对于其他问题:请提供数据,以便我们重现问题!编辑您的问题:*.com/posts/43735470/edit 在当前状态下,您的问题与 SO 无关。 *.com/help/closed-questions
  • 您的索引错误。当您调用pollutantmean(".","sulf",70:72) 时,函数pollutantmeanlength(id) 的值是多少? ...对于循环中i 的第一个值for (i in id) 它是什么索引?

标签: r data-science


【解决方案1】:

您的索引错误。调用pollutantmean(".","sulf",70:72)时,函数pollutantmeanlength(id)的值是多少? (answer: 3) ...对于循环中i 的第一个值for (i in id),它是什么索引? (答案:70)
下面是一个示例,说明您正在做什么以及使用错误的索引会得到什么:

sums <- numeric(3)
sums[10] <- 42
sums
# > sums
# [1]  0  0  0 NA NA NA NA NA NA 42

...进一步计算得到NA
因此,问题的根源与您的other question 相同

这是你的函数的清晰版本:

pollutantmean <- function(directory, pollutant, id= 1:332) {
  files <- list.files(directory)
  L <- lapply(files[id], function(f) read.csv(f)[,pollutant])
  sums    <- sapply(L, sum, na.rm=TRUE)
  lengths <- sapply(L, function(l) sum(!is.na(l)))

  list(sums=sums, lengths=lengths, means=sum(sums)/sum(lengths))
}

【讨论】:

  • 非常感谢@jogo!我理解了我的错误并了解了函数 sapply 和 lapply。
最近更新 更多