Stata新手求助:生成新变量后所有观测值丢失问题
Stata变量生成后观测值丢失问题排查解决
核心原因
你执行keep if inlist(FRA2017, "FRA_2017")后所有观测被删除,本质是原变量E1004中不存在"FRA_2017"这个取值——生成的FRA2017完全复制E1004的内容,自然也没有目标值,keep命令直接过滤掉了所有观测,导致后续所有变量都无观测可显示。
分步解决
恢复原始数据
- 若未关闭Stata,输入
restore, not(如果之前执行过preserve);若已关闭,重新导入你的原始数据集——当前所有变量无观测是因为观测被全删了,和变量本身无关,恢复数据后原变量会回到初始状态。
- 若未关闭Stata,输入
先核查原变量取值
- 执行
tab E1004查看E1004的所有实际取值,确认你要匹配的目标值到底是什么:- 是不是大小写不一致?比如实际是"fra_2017"而非"FRA_2017"
- 是不是有多余空格?比如实际是" FRA_2017"或"FRA_2017 "
- 如果有空格问题,生成变量时先清理:
gen FRA2017 = trim(E1004)
- 执行
正确生成变量并避免误删观测
- 生成新变量:
gen FRA2017 = E1004(这一步本身不会丢失数据,问题出在后续的keep) - 若仅需标记符合条件的观测(而非删除其他观测),用标记变量替代
keep:gen is_FRA2017 = (FRA2017 == "你实际查到的目标值"),这样原变量和新变量都会保留完整数据 - 一定要用
keep的话,先验证条件:count if inlist(FRA2017, "目标值"),确认有符合条件的观测后再执行keep
- 生成新变量:
防误操作技巧
- 执行
keep/drop这类破坏性命令前,先输入preserve,后续如果操作错了,用restore就能一键恢复数据 - 字符串匹配时,用
lower(E1004)统一转小写,避免大小写问题:gen FRA2017 = lower(E1004),匹配时也用小写值,比如inlist(FRA2017, "fra_2017")
- 执行
内容的提问来源于stack exchange,提问作者Travis
相关产品推荐
相关产品推荐

