1
想象以下的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
然而,這並不時有雙重匹配工作。
UPDATE: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
)。