2016-04-28 77 views
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.

我的數據僅僅是數字,以及一個獨特的數變量xy的值很大,所以我在尋找一個適用於所有情況的一般規則。

我使用用戶編寫的命令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)。

回答

0

這是一個有點笨重,但它應該工作:

bysort x: egen temp=sd(x) if x!=. 
bysort x (y): replace y=y[1] if temp==0 
drop temp 

由於恆定的標準偏差爲零,溫度= 0,如果非缺失X的都是一樣的。

相關問題