在R中识别逻辑堆叠数据框的有效缺失值与无效NA
区分逻辑堆叠式问题中的两类NA值(R实现)
逻辑堆叠式问题里的NA分为「问题不适用」和「真正缺失」两类,核心判断逻辑是后续问题是否满足前置触发条件:只有当前置问题符合要求(如"踢足球"选"Yes")时,后续问题的NA才是真正缺失;反之则为不适用。
步骤1:构造示例数据
先模拟符合场景的数据框,包含前置问题(是否参与某项运动)和对应后续问题(运动频率):
df <- data.frame( id = 1:5, plays_soccer = c("Yes", "No", "Yes", "Yes", "No"), soccer_freq = c(3, NA, NA, 2, NA), plays_basketball = c("No", "Yes", "No", "No", "Yes"), basketball_freq = c(NA, 4, NA, NA, NA), stringsAsFactors = FALSE )
步骤2:向量化处理(高效推荐)
用dplyr::case_when可以清晰定义规则,比循环更高效:
# 加载dplyr包(未安装先执行install.packages("dplyr")) library(dplyr) # 标记NA类型 df <- df %>% mutate( soccer_freq_na_type = case_when( plays_soccer == "No" & is.na(soccer_freq) ~ "不适用", plays_soccer == "Yes" & is.na(soccer_freq) ~ "真正缺失", !is.na(soccer_freq) ~ "已回答" ), basketball_freq_na_type = case_when( plays_basketball == "No" & is.na(basketball_freq) ~ "不适用", plays_basketball == "Yes" & is.na(basketball_freq) ~ "真正缺失", !is.na(basketball_freq) ~ "已回答" ) )
步骤3:循环实现(适用于多组问题)
如果有大量成对的前置/后续问题,用循环批量处理更省心:
# 定义前置问题列与对应数据列的映射关系 question_pairs <- list( soccer = c(pre = "plays_soccer", data = "soccer_freq"), basketball = c(pre = "plays_basketball", data = "basketball_freq") ) # 循环遍历每一组问题 for (pair in question_pairs) { pre_col <- pair["pre"] data_col <- pair["data"] na_type_col <- paste0(data_col, "_na_type") df[[na_type_col]] <- ifelse( df[[pre_col]] == "No" & is.na(df[[data_col]]), "不适用", ifelse( df[[pre_col]] == "Yes" & is.na(df[[data_col]]), "真正缺失", "已回答" ) ) }
查看处理结果
执行print(df)即可看到标记后的完整数据,示例输出如下:
id plays_soccer soccer_freq plays_basketball basketball_freq soccer_freq_na_type basketball_freq_na_type 1 1 Yes 3 No NA 已回答 不适用 2 2 No NA Yes 4 不适用 已回答 3 3 Yes NA No NA 真正缺失 不适用 4 4 Yes 2 No NA 已回答 不适用 5 5 No NA Yes NA 不适用 真正缺失
内容的提问来源于stack exchange,提问作者user20822481
相关产品推荐
相关产品推荐

