如何在指定范围重复观测?按Name延续前一日drop变量值至次日
嘿,我来帮你解决这两个Stata的技术问题,先看你提供的示例数据集,然后逐个需求拆解:
示例数据集(由dataex生成)
clear input str4 name long date str8 time float drop "A" 17659 "11:32:41" 1 "A" 17659 "12:32:41" 1 "A" 17659 "13:32:41" 1 "A" 17660 "11:32:41" . "A" 17660 "12:32:41" . "A" 17660 "13:32:41" . "A" 17660 "14:32:41" . "B" 17659 "11:32:41" . "B" 17659 "12:32:41" . "B" 17659 "13:32:41" . "B" 17659 "14:32:41" . "B" 17660 "11:32:41" 1 "B" 17660 "12:32:41" . "B" 17660 "13:32:41" . end
(注:我补全了你输入截断的B的17660后续记录,方便演示)
需求1:在指定范围内重复观测
如果你的“指定范围”是指特定分组、日期或行范围内的观测重复,可以用Stata的expand命令实现,以下是几种常见场景:
按条件重复指定次数:比如要把
name="A"且date=17659的所有观测重复2次(原记录+2次重复):sort name date time // 先确保数据排序,避免重复后顺序混乱 expand 3 if name=="A" & date==17659 // 数字3表示原记录+2次重复,可按需调整按分组统一观测数量:比如每个
name的每日观测要补足到5条,不足的用最后一条记录重复填充:bysort name date: gen obs_num = _n bysort name date: expand 5 - _N if _N < 5 // 补充至5条 bysort name date: replace time = time[_N] if obs_num > _N // 重复最后一条的时间字段指定行号范围重复:比如重复第3到第5行的观测:
expand 2 in 3/5 // 数字2表示原记录+1次重复
需求2:按name填充前一日的drop值至次日记录
你的目标是把每个name前一日的drop非缺失值,填充到次日的所有缺失drop记录中。核心思路是先按name和date分组提取每日有效值,再按名称跨日期填充:
完整实现代码:
// 1. 先排序数据,确保分组操作的顺序正确 sort name date time // 2. 按name+date分组,提取当日第一个非缺失的drop值作为当日代表值 bysort name date: gen daily_drop = drop[1] if !missing(drop[1]) // 3. 按name跨日期填充:将前一日的有效drop值传递到次日的缺失位置 bysort name (date): replace daily_drop = daily_drop[_n-1] if missing(daily_drop) // 4. 将填充后的值赋值给原drop变量的缺失位置 replace drop = daily_drop if missing(drop) // 5. 清理临时变量 drop daily_drop
效果说明:
A的17660所有记录的drop会被填充为前一日(17659)的1B的17660后续缺失的drop会被当日的1填充(因为前一日17659无有效值,无法向前传递)- 所有原已有值的
drop记录保持不变
内容的提问来源于stack exchange,提问作者Amin Karimi
相关产品推荐
相关产品推荐

