2015-12-02 65 views
1

我有以下数据结构。在每组内,一些观察结果缺少value。我知道每个组只有一个非缺失值(组1的10和组2的11)。缺失观测的位置在组内是随机的(即,不能用前一个/后一个值填写缺失值)。如何按组填写缺失值?

如何用组中的一个非缺失值填充缺失值?

group value 
1  . 
1  10 
1  . 
2  11 
2  . 
2  11 

我目前的解决方案是一个循环,但我怀疑有一些聪明的bysort,我可以使用。

levelsof group, local(lm_group) 
foreach group in `lm_group' { 
    levelsof value if group == `group', local(lm_value) 
    replace value = `lm_value' if group == `group' 
} 

回答

1

如果您知道非缺失值是组内恒定的,那么你可以得到有一个与

bysort group (value) : replace value = value[_n-1] if missing(value) 

为遗漏值会先被排序在末尾,然后每个丢失值为replace d以前的非缺失值。更换级联向下,但只在每个组内。

有关文档,看this FAQ

要检查是否有每个组内最多一个独特的非缺失值,你可以这样做:

bysort group (value) : assert (value == value[1]) | missing(value) 

更多的个人笔记。我很高兴看到levelsof正在使用,因为我第一次写它,但上面更好。

1

我认为你正在寻找xfill命令。

要安装xfill,下面复制粘贴到的Stata,并按照指示:

net from http://www.sealedenvelope.com/ 

之后,剩下的就是简单:

xfill value, i(group) 

您可以阅读上涨约xfillhere