R语言case_when填充NA值出错:基于性别与体长更新性成熟列
解决Sexual.Maturity列的NA填充问题
问题根源
- 用
==NA判断缺失值,R中必须用is.na()来检测NA; - 原代码最后
TRUE ~ NA_character_会把所有非匹配行(包括已有有效值的行)都改成NA,导致整列变NA或覆盖已有值; - 第二次修改错误地把逻辑与
&换成了逻辑或|,完全打乱判断逻辑,导致正常数据被覆盖。
dplyr修正方案
保留原有有效值,仅填充NA的行:
data <- data %>% mutate(Sexual.Maturity = case_when( # 仅处理Sexual.Maturity为NA的行 is.na(Sexual.Maturity) & Sex == "M" & Length >= 206.49 ~ "Mature", is.na(Sexual.Maturity) & Sex == "M" & Length < 206.49 ~ "Immature", is.na(Sexual.Maturity) & Sex == "F" & Length >= 188.8 ~ "Mature", is.na(Sexual.Maturity) & Sex == "F" & Length < 188.8 ~ "Immature", # 所有非NA的行,保留原有值 TRUE ~ Sexual.Maturity ))
R Base实现方案
用逻辑索引定位需要填充的行,避免覆盖已有数据:
# 处理雄性且Sexual.Maturity为NA的行 male_na <- is.na(data$Sexual.Maturity) & data$Sex == "M" data$Sexual.Maturity[male_na & data$Length >= 206.49] <- "Mature" data$Sexual.Maturity[male_na & data$Length < 206.49] <- "Immature" # 处理雌性且Sexual.Maturity为NA的行 female_na <- is.na(data$Sexual.Maturity) & data$Sex == "F" data$Sexual.Maturity[female_na & data$Length >= 188.8] <- "Mature" data$Sexual.Maturity[female_na & data$Length < 188.8] <- "Immature"
内容的提问来源于stack exchange,提问作者Sofia
相关产品推荐
相关产品推荐

