想象一下以下的Stata数据结构:
input x y
1 3
1 .
1 .
2 3
2 .
2 .
. 3
end
我想使用对应的其他观察匹配来填充缺失的值。但是,如果存在歧义(在示例中,3对应于1和2),则代码不应复制。在我的示例中,最终的数据结构应如下所示:
1 3
1 3
1 3
2 3
2 3
2 3
. 3
请注意,1和2都被填充,因为它们是明确的3.
我的数据只是数字,变量x
和y
的唯一值的数量很大,因此我正在寻找适用于所有情况的一般规则。
我正在考虑使用用户编写的命令carryforward
,运行类似
bysort x: carryforward y if x != . , replace dynamic_condition(x[_n-1] == x[_n]) strict
bysort y: carryforward x if y != . , replace dynamic_condition(y[_n-1] == y[_n]) strict
然而,当有双重匹配时,这不起作用。
更新:Nick提出的解决方案并不适用于所有示例。我更新了示例以反映这一点。提议的解决方案不起作用的原因是因为函数tag
仅在每个值的一个实例处放置1。因此,当值(3)与两个值(1,2)相关时,标签将仅出现在其中一个值中。因此,复制发生在一个。在上面的例子中,尼克的代码和结果是:
egen tagy = tag(y) if !missing(y)
egen tagx = tag(x) if !missing(x)
egen ny = total(tagy), by(x)
egen nx = total(tagx), by(y)
bysort x (y) : replace y = y[1] if ny == 1
bysort y (x) : replace x = x[1] if nx == 1
list, sep(0)
+-------------------------------+
| x y tagy tagx ny nx |
|-------------------------------|
1. | 1 3 0 0 1 0 |
2. | 1 3 0 0 1 0 |
3. | 1 3 1 1 1 2 |
4. | 2 3 0 1 0 2 |
5. | . 3 0 0 0 2 |
6. | 2 . 0 0 0 0 |
7. | 2 . 0 0 0 0 |
+-------------------------------+
如图所示,该代码适用于填充x=1
而不填充y=3
(第5行)。然而,它没有填充第6行和第7行,因为tagy=1
只出现一次(x=1
)。
答案 0 :(得分:0)
这有点笨拙,但应该有效:
bysort x: egen temp=sd(x) if x!=.
bysort x (y): replace y=y[1] if temp==0
drop temp
由于常数的标准偏差为零,如果非缺失的x都是相同的,则temp = 0。
答案 1 :(得分:0)
sort x, y
replace y = y[_n-1] if missing(y) & x[_n-1] == x[_n]