为循环设置动态停止点

时间:2013-09-30 23:53:26

标签: loops stata

使用与ID相对应的一堆信息设置数据,该ID可以多次显示。

ID          Data
 1            X
 1            Y
 2            A
 2            B
 2            Z
 3            X

我想要一个循环来表示我正在查看的ID的哪个实例。这是第一次,第二次,等等?我想将它作为_#形式的字符串,所以我必须超越Stata中的简单_n函数,据我所知。如果有人知道如何在没有循环的情况下做我想做的事情让我知道,但我仍然会喜欢这个答案。

我在Stata中有以下循环

by ID: gen count_one = _n
gen count_two = ""
quietly forval j = 1/3 { 
replace count_two = "_`j'" if count_one == `j'
}

输出现在看起来像这样:

ID          Data          count_one          count_two
 1            X               1                   _1
 1            Y               2                   _2
 2            A               1                   _1
 2            B               2                   _2
 2            Z               3                   _3
 3            X               1                   _1

问题是如何替换上面的16以告诉Stata采用count_one列的最大值,因为我需要每周运行一次,并且max会改变,我想减少错误。

2 个答案:

答案 0 :(得分:2)

很难理解为什么要这样,但无论你想要数字还是字符串都是一行:

bysort ID : gen nummax = _N 

bysort ID : gen strmax = "_" + string(_N) 

请注意,ID中的排序顺序与每个的观察数量无关。

答案 1 :(得分:1)

你问题的某些部分不清楚(“......替换上面的16告诉Stata ......”)但是:

为什么不将_ntostring一起使用?

gsort +ID +data
bys ID: g count_one=_n
tostring count_one, gen(count_two)
replace count_two="_"+count_two

然后生成最大值(在那里回答部分问题) - 尽管注意这个值将在每个ID值的实例之间重复:

bys ID: egen maxcount1=max(count_one)

或更优雅:

bys ID: g maxcount2=_N