关于R语言Coursera作业complete函数中interested_data语句的疑问
理解R语言
complete函数中的interested_data逻辑 作业背景与解决方案代码
这是Coursera R语言编程作业中的一道题目,要求编写名为complete的函数:读取指定目录下的CSV文件,统计每个文件中**完全观测(complete cases)**的数量,最终返回一个包含监测点ID(对应文件名)和对应完全观测数的data frame。给出的解决方案代码如下:
complete <- function(directory, id = 1:332){ ## 'directory' is a character vector of length 1 indicating ## the location of the CSV files ## 'id' is an integer vector indicating the monitor ID numbers ## to be used ## Return a data frame of the form: ## id nobs ## 1 117 ## 2 1041 ## ... ## where 'id' is the monitor ID number and 'nobs' is the ## number of complete cases results <- data.frame(id=numeric(0), nobs=numeric(0)) for(monitor in id){ path <- paste(getwd(), "/", directory, "/", sprintf("%03d", monitor), ".csv", sep = "") monitor_data <- read.csv(path) interested_data <- monitor_data[(!is.na(monitor_data$sulfate)), ] interested_data <- interested_data[(!is.na(interested_data$nitrate)), ] nobs <- nrow(interested_data) results <- rbind(results, data.frame(id=monitor, nobs=nobs)) } results }
核心逻辑解释
interested_data的作用
interested_data是一个临时数据集,用来逐步筛选出当前监测点数据中,sulfate和nitrate两列都没有缺失值的行——也就是题目要求的「完全观测」。
两行筛选语句的含义
第一行:筛选
sulfate列无缺失的行interested_data <- monitor_data[(!is.na(monitor_data$sulfate)), ]is.na(monitor_data$sulfate):生成一个布尔向量,每一位对应monitor_data的一行,值为TRUE表示该行的sulfate是缺失值(NA),FALSE表示无缺失。!:对布尔向量取反,把「是缺失值」的判断转为「不是缺失值」的判断。- 用这个取反后的向量筛选
monitor_data的行,只保留sulfate列无缺失的所有行,赋值给interested_data。
第二行:筛选
nitrate列无缺失的行interested_data <- interested_data[(!is.na(interested_data$nitrate)), ]- 逻辑和第一行完全一致,不过是在已经筛选过
sulfate的数据集基础上,进一步筛选nitrate列无缺失的行。 - 经过这两步,
interested_data中就只剩下sulfate和nitrate都无缺失的行,统计它的行数nrow(interested_data)就是当前文件的完全观测数。
- 逻辑和第一行完全一致,不过是在已经筛选过
更简洁的等价写法
R内置了complete.cases()函数,可以直接判断每行是否为完全观测(所有列无缺失),用它可以简化代码:
# 替换原代码中两行筛选和nobs赋值的部分 nobs <- sum(complete.cases(monitor_data))
complete.cases(monitor_data)返回的布尔向量标记了所有完全观测的行,sum()会自动统计其中TRUE的数量(因为R中TRUE等价于1,FALSE等价于0),结果和原代码完全相同。
内容的提问来源于stack exchange,提问作者Ashutosh Tiwari
相关产品推荐
相关产品推荐

