如何使用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
我有一个大型面板数据集,如下所示。
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