我想创建一个变量(计数器),它每年计算另一个变量( 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
答案 0 :(得分:3)
系统变量_n
已修复,因为它表示当前观察的编号,与if
条件无关。您对代码的要求是counter
,如果没有丢失,则会显示观察次数的值。这与直到特定点的非缺失观察计数不同,这是您真正想要的。
请注意
缺失的数据类型。当你提出它时,firmage0
似乎是一个字符串变量,因为
空白是字符串的缺失。数值缺失是
表示为.
(或.<something>
)。见help missings
。
一种解决方案是针对sum
执行累积missings
条件。我假设变量类型是数字:
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)
的计算结果为false(0)或true(1),具体取决于firmage0
的观察是否缺失。然后sum
执行累计总和。
如果变量实际上是字符串类型,则将相应的行替换为:
replace counter = "" if missing(firmage0) // optional
单行(对于数字类型)是:
bysort year: gen counter = cond(missing(firmage0), ., sum(!missing(firmage0)))
但我更喜欢第一种方式,因为它更容易阅读。
答案 1 :(得分:1)
我相信如果你之前按year
和firmage0
排序:
. 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