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

面板数据中仅对首次观测工作时长为正的个体填充缺失值为0的方法

问题原因说明

你原有代码的逻辑存在3个核心问题:

  • 判断条件仅作用于当前行,无法将「首轮工作时长为正」的标记覆盖到同一个体的所有轮次
  • 错误将首轮原本为正的work_hours替换为0,完全违背需求逻辑
  • replace_na语法使用错误,正确用法为replace_na(待替换列, 替换值)
正确实现代码

需先加载dplyr和tidyr包,代码逻辑为先按个体分组,标记该个体是否符合替换条件,再对符合条件的个体统一填充缺失值:

library(dplyr)
library(tidyr)

df <- df %>%
  group_by(id) %>%
  # 标记个体是否符合替换条件:首轮wave=1的work_hours为正,na.rm避免NA导致判断出错
  mutate(qualify = any(wave == 1 & work_hours > 0, na.rm = T),
         # 符合条件的个体所有NA替换为0,否则保持原值
         workhours_imputed = ifelse(qualify, replace_na(work_hours, 0), work_hours)) %>%
  ungroup() %>%
  # 可选:删除中间生成的标记列
  select(-qualify)

也可以用coalesce简化写法,效果完全一致:

df <- df %>%
  group_by(id) %>%
  mutate(workhours_imputed = if_else(any(wave == 1 & work_hours > 0, na.rm = T), coalesce(work_hours, 0), work_hours)) %>%
  ungroup()
运行结果验证

处理后的数据如下,完全符合需求:ID3、ID4的所有缺失值替换为0,ID2的缺失值保持不变,原有非缺失值无修改:

idwaveyearwork_hoursworkhours_imputed
1120074040
1220083939
1320093939
1420103838
212005NANA
2220063535
2320073535
242008NANA
3120074040
322008NA0
3320094040
3420104040
4120093232
422010NA0
4320113232
442012NA0

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:00:06