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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 13:38:06