我有以下数据结构。在每个组中,一些观察结果缺失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'
}
答案 0 :(得分:2)
如果您知道非缺失值在组内是不变的,那么您可以使用
来实现 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 :(得分:2)
我认为xfill命令就是你要找的。 p>
要安装xfill
,请将以下内容复制粘贴到Stata中,然后按照说明操作:
net from http://www.sealedenvelope.com/
之后,其余的很容易:
xfill value, i(group)
您可以阅读xfill
here
答案 2 :(得分:0)
您正在寻找的聪明的bysort-answer是:
bysort group: egen new_value=max(cond(!missing(value), value, .)
cond函数检查第一个参数是否为true,如果为is和返回值。如果不是这样的话。