Stata:计数时忽略缺失的值

Stata:计数时忽略缺失的值,stata,Stata,我想创建一个变量(计数器),它每年统计另一个变量(firmage0)的非缺失值。我的代码如下所示: sort year quietly by year: gen counter = _n if firmage0 != . year firmage0 counter 1975 1975 1975 1975 1975 21 1 1975 1975 60 2 1975 1

我想创建一个变量(计数器),它每年统计另一个变量(firmage0)的非缺失值。我的代码如下所示:

sort year  
quietly by year: gen counter = _n if firmage0 != . 
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    
不幸的是,即使缺少值,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
但数据集应如下所示:

sort year  
quietly by year: gen counter = _n if firmage0 != . 
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    

我相信,如果您按
年份
公司0
进行排序:

. 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

系统变量
\n
是固定的,因为它表示与
if
条件无关的当前观察次数。您对代码的要求是一个
计数器
,如果观察值没有丢失,它将接受观察值的值。这不同于直到某一点的未缺失观测值的计数,这是您真正想要的

注意 您丢失的数据类型。正如您所展示的,
firmage0
看起来像一个字符串变量,因为 空白是字符串的缺失。数字值的缺失是 表示为
(或
)。请参阅
帮助信息

一种解决方案是在
缺失
的条件下进行累积
求和
。我假设变量类型为数字:

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)
!缺失(firmage0)
的计算结果分别为false(0)或true(1),具体取决于
firmage0
的观察值是否缺失。然后,
sum
计算其累计和

如果变量实际上是字符串类型,则将相应的行替换为:

replace counter = "" if missing(firmage0) // optional
一行代码(用于数字类型)为:


但是我更喜欢第一种方法,因为它更容易阅读。

考虑使用
!缺少(firmage0)
而不是
firmage0!=
将其推广到字符串和数字类型。这是有风险的,因为如果没有额外的代码,您以前的
排序
顺序将无法可靠恢复。非常感谢!回答得很好。