我的目录中有一个文件列表(从 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))
}
在此先感谢您的帮助!
你的索引是错误的。调用时pollutantmean(".","sulf",70:72)
,length(id)
函数中的值是pollutantmean
多少?(答案: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
所以,问题的根源与您的其他问题相同
这是您的功能的清晰版本:
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))
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句