【问题标题】:How can I delete objects without complete data by using stata如何使用 stata 删除没有完整数据的对象
【发布时间】:2026-01-23 09:25:01
【问题描述】:

我有一个大型面板数据集,如下所示。

 input id age high weight str6 daily_drink
1 10 110 35 water
1 10 110 35 coffee
1 11 120 38 water
1 11 120 38 coffee
1 12 130 50 water
1 12 130 50 coffee
2 11 118 31 water
2 11 118 31 coffee
2 11 118 31 milk
2 12 123 38 water
2 12 123 38 coffee
2 12 123 38 milk
3 10 98 55 water
3 11 116 36 water
3 12 129 39 water
4 12 125 40 water
 
end

但是,我想使用 stata 来保留完整的 10、11 和 12 年龄的对象。看起来像这样。

id  age high    weight  daily_drink
1   10  110     35      water
1   10  110     35      coffee
1   11  120     38      water
1   11  120     38      coffee
1   12  130     50      water
1   12  130     50      coffee
3   10  98      55      water
3   11  116     36      water
3   12  129     39      water

但是,所有行都没有丢失数据,所以我不能简单地删除丢失数据的行。有什么办法吗?任何建议都会有所帮助。提前致谢。

【问题讨论】:

    标签: stata


    【解决方案1】:

    您可以为此使用 bysort 和 egen。类似于

    bysort id: egen has10 = total(age==10)
    bysort id: egen has11 = total(age==11)
    bysort id: egen has12 = total(age==12)
    keep if (has10 != 0) & (has11 != 0) & (has12 != 0)
    

    应该可以工作(未经测试)。有关更多信息,请参阅help egen。如果您有非常大的数据 (ssc install gtools),请安装 gtools,然后将 egen 替换为 gegen。

    【讨论】:

    • 这是我认为最平坦的道路。请注意,最后一条语句可以简化为keep if has10 & has11 & has12,因为非零意味着任何变量都不可能得到正确的结果。
    【解决方案2】:

    如果 10、11、12 是唯一可能的年龄值,则可行的解决方案:

    bysort id (age) : gen nvals = sum(age != age[_n-1]) 
    by id : replace nvals = nvals[_N] 
    keep if nvals == 3 
    

    同时考虑

    bysort id (age) : gen OK1 = age[1] == 10 & age[_N] == 12 
    by id : egen OK2 = max(age == 11) 
    keep if OK1 & OK2 
    

    【讨论】: