R中基于条件的缺失值插补:将非吸烟者的‘Not available’设为0
R中基于条件的缺失值插补:将非吸烟者的‘Not available’设为0
嗨!这个需求非常合理——毕竟过去吸烟或从不吸烟的人,当前日均吸烟量确实应该是0,而不是缺失值。我给你分享几种在R里实现这个逻辑的常用方法,你可以根据自己的习惯选择:
方法一:基础R(无需额外包)
假设你的数据框名叫df,两个变量分别是Do_you_smoke(分类变量)和cigarettes_per_day(日均吸烟量)。直接用条件索引赋值即可:
# 先处理可能的字符串型缺失值(如果"Not available"是文本的话) df$cigarettes_per_day[df$cigarettes_per_day == "Not available"] <- NA # 转成数值型(如果原本是字符格式) df$cigarettes_per_day <- as.numeric(df$cigarettes_per_day) # 核心:将Do_you_smoke为2或3的观测,日均吸烟量设为0 df$cigarettes_per_day[df$Do_you_smoke %in% c(2, 3)] <- 0
这里的%in%用来检查Do_you_smoke的取值是否在c(2,3)这个向量里,精准定位到需要修改的观测。
方法二:tidyverse/dplyr(更清晰的代码逻辑)
如果你平时用tidyverse系列工具,用mutate+case_when的组合会让代码可读性更强,尤其适合复杂的多条件场景:
library(dplyr) # 先处理字符串缺失值(如果需要的话) df <- df %>% mutate(cigarettes_per_day = ifelse(cigarettes_per_day == "Not available", NA, cigarettes_per_day), cigarettes_per_day = as.numeric(cigarettes_per_day)) %>% # 按条件赋值 mutate(cigarettes_per_day = case_when( Do_you_smoke %in% c(2, 3) ~ 0, TRUE ~ cigarettes_per_day # 其他情况(比如当前吸烟的人)保持原数值不变 ))
小提醒
操作前建议先备份原始数据,比如df_backup <- df,这样万一操作失误可以随时恢复~
备注:内容来源于stack exchange,提问作者Francesco Lo Riso
相关产品推荐
相关产品推荐

