如何修正R语言中complete函数的行计数逻辑以匹配作业要求?
问题描述
需要统计指定PM监测点中sulfate和nitrate列均无NA值的观测数,预期输出每行对应一个监测点ID及其完整观测数,但现有代码每次迭代都返回结果,统计逻辑错误,输出重复不符合要求。
数据集包含332个CSV文件,文件名对应监测点ID(如200.csv对应ID200),每个文件含3个变量,部分观测有NA值需剔除。
现有代码:
complete <- function(directory, id = 1:332){ path1<- setwd(paste("C:/Users/my_drive/Documents/Coursera/R", directory, sep= "/")) list1<- list.files(path1) data1<- data.frame() for(i in id){ data1 <- rbind(data1, read.csv(list1[i])) data1 <- data1[complete.cases(data1),] I <- c(data1$ID) N <- c(data1$n) complete_data <- data.frame(id = I, nobs = N) print(complete_data) }}
修正后的代码
complete <- function(directory, id = 1:332) { # 初始化存储结果的数据框,指定列类型避免后续报错 result <- data.frame(id = integer(), nobs = integer()) # 逐个处理每个指定的监测点ID for (i in id) { # 自动生成3位数字的文件名(比如ID1转为001.csv) filename <- sprintf("%03d.csv", i) # 拼接出正确的文件路径,适配不同操作系统 file_path <- file.path(directory, filename) # 读取当前监测点的CSV数据 current_data <- read.csv(file_path) # 只筛选sulfate和nitrate都无NA的观测 valid_rows <- complete.cases(current_data$sulfate, current_data$nitrate) # 统计有效观测的数量 valid_count <- sum(valid_rows) # 将当前监测点的ID和有效数添加到结果中 result <- rbind(result, data.frame(id = i, nobs = valid_count)) } # 循环结束后统一返回结果 return(result) }
修正说明
- 移除硬编码路径:原代码用
setwd写死了本地路径,换成sprintf生成标准文件名、file.path拼接路径,既适配不同系统,又能准确匹配3位数字的CSV文件(比如ID5对应005.csv)。 - 修复循环逻辑:原代码每次循环都把新数据合并到旧数据再过滤,导致之前的监测点数据被重复统计。现在改为单独处理每个监测点,统计完当前点的有效数就存入结果,各监测点数据互不干扰。
- 精准筛选有效观测:用
complete.cases(current_data$sulfate, current_data$nitrate)只检查目标两列,避免其他列的NA值影响统计结果。 - 统一输出结果:原代码在循环内每次
print导致输出混乱,现在把所有结果存在一个数据框里,循环结束后统一返回,符合每行对应一个监测点的预期格式。 - 初始化结果结构:提前指定结果数据框的列类型,避免后续合并时出现类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Nubie coder
相关产品推荐
相关产品推荐

