假设我有以下面板数据(为简单起见,不包括时间变量)
clear
input id var
1 .
1 0
1 0
1 .
2 .
2 .
2 .
2 .
3 1
3 .
3 .
3 0
end
我想删除所有组中缺少所有数据的组,也就是说,我希望我的数据如下:
id var
1 .
1 0
1 0
1 .
3 1
3 .
3 .
3 0
我尝试过gen todrop = var[_N]
,但出于某种原因,对于某些群体来说,它并不起作用。有什么想法吗?我考虑过sort
id var
,然后进行级联替换,但我确信有更好的方法可以做到这一点。
答案 0 :(得分:2)
通常,在适当sort
之后,您可以通过检查每个面板中的第一个和最后一个观察结果来验证所有观察值是否保持相同值。同样的原则适用于此。我将使用missing()
函数:
clear
set more off
input id myvar
1 .
1 0
1 0
1 .
2 .
2 .
2 .
2 .
3 1
3 .
3 .
3 0
end
bysort id (myvar) : gen todrop = missing(myvar[1]) & missing(myvar[_N])
list, sepby(id)
在这种情况下,只检查第一个也可以。如果它丢失了,所有其他人都是。
请参阅help by
。
答案 1 :(得分:0)
Roberto提供了一个解决方案,但是该解决方案因具体情况而异,并可能导致错误的结果。 实际上,假设您有如下观察结果:
id myvar
2 .
2 1
2 .
使用Roberto的代码,您将删除此组,而在问题中,仅当所有观测值缺失时才需要删除。
因此,我建议您使用其他方法,如下所示:
levels id, local(groups) // creates unique values for id (no need to egen if you don't really have to)
foreach iter of local groups {
mdesc myvar if id == "`iter'" // use mdesc and put double quotes if id is a string
drop if id == "`iter'" & r(percent) == 100 // r(percent) is stored after mdesc
}
答案 2 :(得分:0)
Roberto的代码肯定有效。下面的代码也是如此。唯一的贡献就是,如果您愿意,可以保留原始的观测顺序(排序)。
egen todrop2 = min(missing(myvar)), by(id)