Coursera作业:R语言complete函数nobs值恒定问题求助
问题排查与修正方案
问题分析
你的代码存在两个核心错误,导致nobs值始终恒定:
- 未读取目标文件内容:原代码中
mdata是目录下所有文件的路径列表(字符串向量),直接对mdata调用complete.cases(),实际是判断文件名是否为缺失值,而非读取文件内的观测数据。因为所有文件名都有效,所以sum(complete.cases(mdata))会返回固定的文件总数(即你看到的333),和每个文件的实际观测数完全无关。 - 循环赋值逻辑错误:循环内每次直接覆盖
nobs为单个值,而非为每个id对应的文件计算结果并追加到向量中。最终返回时,单个nobs值会被自动重复成与id长度一致的向量,导致所有行的nobs都相同。
修正后的代码
complete <- function(directory, id = 1:332) { # 获取目录下所有文件的完整路径 file_paths <- list.files(directory, full.names = TRUE) # 初始化与id长度匹配的结果向量 nobs <- numeric(length(id)) for (idx in seq_along(id)) { # 取出当前循环对应的id current_id <- id[idx] # 读取对应id的文件数据 data <- read.csv(file_paths[current_id]) # 计算当前文件的完全观测案例数并赋值 nobs[idx] <- sum(complete.cases(data)) } # 返回包含id和对应nobs的数据框 data.frame(id = id, nobs = nobs) }
修正说明
- 读取文件内容:循环中通过
read.csv(file_paths[current_id])读取对应id的文件数据,真正针对观测数据计算完全案例数。 - 结果存储逻辑:初始化
nobs为与id长度一致的向量,循环中按索引为每个id对应的位置赋值,确保每个id匹配正确的观测数。 - 文件索引匹配:Coursera的
specdata目录下文件命名为001.csv到332.csv,list.files返回的路径顺序正好对应id从1到332,因此直接用file_paths[current_id]即可正确匹配目标文件。
内容的提问来源于stack exchange,提问作者Serdoc
相关产品推荐
相关产品推荐

