创建一个变量,如果在另一个变量中发现新值,则该变量递增一个

时间:2018-07-02 17:59:16

标签: stata

我有以下(已排序)变量:

35 
35     
37 
37 
37 
40 

我想创建一个新变量,当原始变量中出现一个新数字时,该变量将增加一个。

例如:

35    1
35    1    
37    2
37    2
37    2
40    3

我曾考虑使用bybysort命令,但似乎都无法解决问题。这看起来像很多人需要的东西,但我找不到答案。

2 个答案:

答案 0 :(得分:2)

您只是在计算一个值与以前的值相隔多久。这对于观察1也有效,因为对观察0的值的任何引用都以丢失的形式返回,因此在您的示例中35不等于丢失。

clear
input x 
35 
35     
37 
37 
37 
40 
end 

gen new = sum(x != x[_n-1]) 
list, sepby(new) 

     +----------+
     |  x   new |
     |----------|
  1. | 35     1 |
  2. | 35     1 |
     |----------|
  3. | 37     2 |
  4. | 37     2 |
  5. | 37     2 |
     |----------|
  6. | 40     3 |
     +----------+
如果您有一些观察点需要分别处理,那么

by就很有意义。这里的一项基本原则是,如果为true,则将true或false比较(此处,两个值是否相等)评估为1,将false评估为0。

答案 1 :(得分:1)

@Nick击败了我几分钟,但这是另一种更清洁的方法:

clear

input foo
35 
35     
37 
37 
37 
40
end

egen counter = group(foo)

list

     +---------------+
     | foo   counter |
     |---------------|
  1. |  35         1 |
  2. |  35         1 |
  3. |  37         2 |
  4. |  37         2 |
  5. |  37         2 |
     |---------------|
  6. |  40         3 |
     +---------------+

此方法使用egen命令及其关联的group()函数。

此功能还有两个选项,missing可能是最有用的。

从命令的帮助文件中:

  

“ ...丢失表示分配组时,将varlist中的缺失值(。或”“)与其他任何值一样对待,而不是将缺失值分配给缺少的组... “

clear

input foo
35 
35
.     
37 
37 
37 
40
.
end

egen counter = group(foo), missing

sort foo
list

     +---------------+
     | foo   counter |
     |---------------|
  1. |  35         1 |
  2. |  35         1 |
  3. |  37         2 |
  4. |  37         2 |
  5. |  37         2 |
     |---------------|
  6. |  40         3 |
  7. |   .         4 |
  8. |   .         4 |
     +---------------+

代替:

drop counter
egen counter = group(foo)

sort foo
list

     +---------------+
     | foo   counter |
     |---------------|
  1. |  35         1 |
  2. |  35         1 |
  3. |  37         2 |
  4. |  37         2 |
  5. |  37         2 |
     |---------------|
  6. |  40         3 |
  7. |   .         . |
  8. |   .         . |
     +---------------+

另一个选项是label

  

“ ... label选项根据已排序的varlist的不同组从1开始返回整数。如果整数存在,则用varlist的值或值标签进行标记...”

使用没有缺失值的示例:

egen counter = group(foo), label

list

     +---------------+
     | foo   counter |
     |---------------|
  1. |  35        35 |
  2. |  35        35 |
  3. |  37        37 |
  4. |  37        37 |
  5. |  37        37 |
     |---------------|
  6. |  40        40 |
     +---------------+