2013-09-30 25 views
1

数据设置时会附带一系列对应于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列,因为我需要每周运行这个最大值将会改变,我想减少错误。

回答

1

你的问题的某些部分不明确(“...替换上面讲的Stata的16 ...”),但:

你为什么不只是使用_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 
+1

最后的命令不起作用。应该是'gen',而不是'egen'。 'tostring'不如'string()'直接。 –

+0

感谢您的支持。现在修复。 – SOConnell

2

很难理解为什么你要这样,但它是你是否想一行数字或字符串:

bysort ID : gen nummax = _N 

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

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

+0

要匹配示例'_N'需要更改为'_n'。请改变,我会接受。仅供参考:当数据被合并并且它们的变量名称附加字符串(_n)值以追踪时,这是必需的。 – CJ12

+0

你的问题最后要求_maximum_,这就是我的答案给你的。我认为没有理由改变我的答案,但这是一个问题。 –

+0

对于未来的读者,请修正@SOConnell指出的对'16'的神秘引用。 –