自定义pollutantmean函数计算均值错误,请求排查R代码问题
下面是代码里的关键错误及修正方案:
函数名大小写不匹配:R对大小写敏感,你定义的函数是
Pollutantmean(首字母大写),但调用时用的是pollutantmean(全小写),这会导致函数无法正确匹配,先把函数名统一为pollutantmean。硬编码覆盖directory参数:你直接将
directory赋值为固定本地路径,还调用setwd修改全局工作目录,这让函数的directory参数完全失效,也会干扰其他代码的工作路径。正确做法是用file.path(directory, 文件名)拼接路径,无需修改全局目录。循环读取文件未累加数据:循环里每次都用
allcsv覆盖当前文件数据,最后只保留了最后一个CSV的内容,没有把所有指定ID的文件合并起来。而且你读取了所有CSV,不是id参数指定的那些,应该循环处理每个ID对应的文件,并将数据追加到合并数据框中。忽略pollutant参数:你直接把
pollutant变量覆盖成sulfate和nitrate两列,完全没用到传入的污染物类型参数,应该根据pollutant的值选择对应列。ID筛选逻辑错误:你单独提取ID列进行筛选,既丢失了污染物数据,还把筛选条件写反了(应该是
ID %in% id,而非id %in% ID)。正确做法是直接在合并后的数据集里筛选符合ID条件的行。均值计算逻辑错误:你把两种污染物的总和相加,再除以监测器数量,这根本不是指定污染物的均值。正确方式是提取筛选后的数据中指定污染物的非NA值,用
mean(..., na.rm = TRUE)直接计算均值。
修正后的完整代码
pollutantmean <- function(directory, pollutant, id = 1:332) { # 初始化空数据框用于存储合并后的数据 combined_data <- data.frame() # 循环处理每个指定ID对应的监测器文件 for (i in id) { # 格式化文件名,确保是3位数字格式(如1转为001.csv) filename <- sprintf("%03d.csv", i) # 拼接完整的文件路径 file_path <- file.path(directory, filename) # 读取当前CSV文件 current_data <- read.csv(file_path, header = TRUE) # 将当前文件数据追加到合并数据框中 combined_data <- rbind(combined_data, current_data) } # 提取指定污染物的列值 pollutant_values <- combined_data[[pollutant]] # 计算非NA值的均值 mean_value <- mean(pollutant_values, na.rm = TRUE) # 返回计算结果 return(mean_value) }
现在运行pollutantmean("specdata", "sulfate", 1:10)就能得到正确结果[1] 4.064128了。
内容的提问来源于stack exchange,提问作者raza zaidi

