我想检查一个值是否出现在同一列的某个前一行中。 最后,我希望得到不同观察数量的累积计数。
除了集中所有_n行并使用正则表达式之外,还有其他解决方案吗?我在那里连接行,但是给出了字符串变量的244个字符的限制(在Stata< 13中),这有时不适用。
这就是我现在正在做的事情:
gen tmp=x
replace tmp = tmp[_n-1]+ "," + tmp if _n > 1
gen cumu=0
replace cumu=1 if regexm(tmp[_n-1],x+"|"+x+",|"+","+x+",")==0
replace cumu= sum(cumu)
实施例
+-----+
| x |
|-----|
1. | 12 |
2. | 32 |
3. | 12 |
4. | 43 |
5. | 43 |
6. | 3 |
7. | 4 |
8. | 3 |
9. | 3 |
10. | 3 |
+-----+
变为
+-------------------------------+
| x | tmp |
|-----|--------------------------
1. | 12 | 12 |
2. | 32 | 12,32 |
3. | 12 | 12,32,12 |
4. | 43 | 3,32,12,43 |
5. | 43 | 3,32,12,43,43 |
6. | 3 | 3,32,12,43,43,3 |
7. | 4 | 3,32,12,43,43,3,4 |
8. | 3 | 3,32,12,43,43,3,4,3 |
9. | 3 | 3,32,12,43,43,3,4,3,3 |
10. | 3 | 3,32,12,43,43,3,4,3,3,3|
+--------------------------------+
最后
+-----------+
| x | cumu|
|-----|------
1. | 12 | 1 |
2. | 32 | 2 |
3. | 12 | 2 |
4. | 43 | 3 |
5. | 43 | 3 |
6. | 3 | 4 |
7. | 4 | 5 |
8. | 3 | 5 |
9. | 3 | 5 |
10. | 3 | 5 |
+-----------+
任何想法如何避免中间步骤' (对于我来说,x
中的字符串而不是数字时非常重要。)
谢谢!
答案 0 :(得分:1)
正则表达式很棒,但在其他地方,简单的计算就足够了。使用您的样本数据
. input x x 1. 12 2. 32 3. 12 4. 43 5. 43 6. 3 7. 4 8. 3 9. 3 10. 3 11. end end of do-file
您可以识别每个不同值的第一次出现:
. gen long order = _n . bysort x (order) : gen first = _n == 1 . sort order . l +--------------------+ | x order first | |--------------------| 1. | 12 1 1 | 2. | 32 2 1 | 3. | 12 3 0 | 4. | 43 4 1 | 5. | 43 5 0 | |--------------------| 6. | 3 6 1 | 7. | 4 7 1 | 8. | 3 8 0 | 9. | 3 9 0 | 10. | 3 10 0 | +--------------------+
到目前为止看到的不同值的数量只是first
使用sum()
的累积总和。这也适用于字符串变量。事实上,这个问题是
http://www.stata-journal.com/sjpdf.html?articlenum=dm0042
所有人都可以访问.pdf。 search distinct
会指向你这篇文章。
熟练掌握by:
,sort
,_n
和_N
所能做的事情,这是Stata的一项重要技能。另见
http://www.stata-journal.com/sjpdf.html?articlenum=pr0004
所有人都可以访问的另一篇文章。