如何使用stata删除没有完整数据的对象

How can I delete objects without complete data by using stata

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

 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

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

您可以为此使用 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。

如果 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