我的目录中有一个文件列表(从1到332)。 file1对应于id1,file2对应于id2,依此类推。
每个文件包含4列,我必须通过忽略NA来计算第2列的总和和长度(标记为“污染物”)。
我已经尝试了一切:!is.na(文件),na.rm = TRUE,省略...当我想要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))
}
提前感谢您的帮助!
答案 0 :(得分:0)
您的索引错误。当您致电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
因此,问题的根源与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))
}