Stata:计数时忽略缺失的值
我想创建一个变量(计数器),它每年统计另一个变量(firmage0)的非缺失值。我的代码如下所示: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
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!=
将其推广到字符串和数字类型。这是有风险的,因为如果没有额外的代码,您以前的排序
顺序将无法可靠恢复。非常感谢!回答得很好。