Stata:新观察的累积数量

时间:2013-11-11 15:37:49

标签: regex stata

我想检查一个值是否出现在同一列的某个前一行中。 最后,我希望得到不同观察数量的累积计数。

除了集中所有_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中的字符串而不是数字时非常重要。)

谢谢!

1 个答案:

答案 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

所有人都可以访问的另一篇文章。