2013-12-16 150 views
3

當我想創造出在計算每年另一個變量(firmage0)的非缺失值的變量(計數器)缺失值。我的代碼如下所示:塔塔:忽略計數

sort year 
quietly by year: gen counter = _n if firmage0 != . 

不幸的是,即使存在缺失值,Stata也會從1開始計數。但是我想在有一個非缺失值時開始計數。另外,第二個無缺陷值應該具有值「2」,第三個「3」等等。有一個重要的限制。請勿使用保留恢復!在創建變量計數器後,我的數據集看起來像這樣(這只是它的一小部分)。可用空間意味着缺少價值!

year firmage0 counter 
1975   
1975   
1975   
1975   
1975 21 5 
1975   
1975 60 7 
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975 115 20 
1975   
1975   
1975 

但該數據集應該是這樣的:

year firmage0 counter 
1975   
1975   
1975   
1975   
1975 21 1 
1975   
1975 60 2 
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975 115 3 
1975   
1975   
1975  

回答

3

系統變量_n,它獨立於您的if條件表示的當前觀測的數量的意義上固定。你要求的代碼是counter,如果它沒有丟失,那麼它的值爲。這與直到某一點的非缺失觀測的數量不同,這是你真正想要的。

請注意錯誤信息的 數據類型。如您所示,firmage0看起來像一個字符串變量,因爲 空白是字符串的缺失。數值的缺失是 ,表示爲.(或.<something>)。見help missings

一種解決方案是在missings的條件下進行累積sum。我假定變量類型是數字:

clear all 
set more off 

input year firmage0 
1975  . 
1975  . 
1975  .  
1975  . 
1975 21 
1980 60 
1980 . 
1980 89  
1985  . 
1985  . 
1985 23  
1985 45  
1985 47 
1985  . 
end 

list, sepby(year) 

bysort year: gen counter = sum(!missing(firmage0)) 
replace counter = . if missing(firmage0) // optional 

list, sepby(year) 

!missing(firmage0)評估爲假(0)或真根據用於firmage0觀察是否分別缺少或沒有,(1)。然後sum做這個累計的總和。

如果變量是在字符串類型的事實,那麼替換爲對應的線:

replace counter = "" if missing(firmage0) // optional 

一個一襯墊(用於數字式)爲:

bysort year: gen counter = cond(missing(firmage0), ., sum(!missing(firmage0))) 

但我更喜歡第一種方式,因爲它更容易閱讀。

+0

非常感謝!很好的答案。 –

+0

+1。將「格式」的一個實例編輯爲「存儲類型」。 –

1

我相信,如果你按yearfirmage0前:

. sort year firmage0 

,你將有你的問題解決了。我改變了其中一個firmage0值的年份,以確認它會重新啓動計數。

. by year : gen counter = _n if firmage0 !=. 

year firmage0 counter    
1975 21 1  
1975 60 2 
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1975   
1976 115 1 
+1

考慮使用'!missing(firmage0)'而不是'firmage0!=。'來概括字符串和數字類型。 –

+1

如果沒有額外的代碼,您之前的「排序」命令將無法可靠地恢復,這是有風險的。 –