You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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两列都没有缺失值的行——也就是题目要求的「完全观测」。

两行筛选语句的含义

  1. 第一行:筛选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。
  2. 第二行:筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:57:49